IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Possible d'instancier une interface ?


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut Possible d'instancier une interface ?
    Salut,

    J'ai toujours cru que le fait qu'on ne puisse pas instancier une interface signifiait qu'on ne pouvait pas utiliser le mot cle new avec une interface.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<String> l = new List<String>(); //Compile Time Error
    Pourtant je vois souvent dans des exemples ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Runnable r = new Runnable() {public void run(){System.out.println("Middle Access");}};
    ...
    Serializable s = new Serializable(){};
    Cette question est un peu bancale mais pourquoi cela est possible si les specifications de Java precisent que c'est impossible. Je rate quelque chose mais je n'arrive pas a mettre le doigt dessus. Y a t il une exception pour les interfaces anonymes ? Ou bien j'ai tord d'associer instance et new ?

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Runnable r = new Runnable() {public void run(){System.out.println("Middle Access");}};
    ne crée pas une interface anonyme, mais une classe anonyme implémentant l'interface Runnable. Et donc, c'est bel et bien une classe !

    Edit : enfin pour être plus précis, il y a création d'une classe anonyme héritant d'Objet et implémentant l'interface Runnable, et on fait une instanciation de cette classe anonyme.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Runnable r = new Runnable() {public void run(){System.out.println("Middle Access");}};
    ne crée pas une interface anonyme, mais une classe anonyme implémentant l'interface Runnable. Et donc, c'est bel et bien une classe !

    Edit : enfin pour être plus précis, il y a création d'une classe anonyme héritant d'Objet et implémentant l'interface Runnable, et on fait une instanciation de cette classe anonyme.
    Et cela est sous-entendu parce que la classe a le meme nom que l'interface ? C'est juste ce point qui me gratte les yeux : l'information sur l'interface implemente est embarque dans le "nom" de la classe anonyme. Je ne suis pas sur de comprendre mais je veux bien en admettre le principe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    interface Enjoyable {
    	public void haveFun();
    }
     
    ...
    new Enjoyable(){public void haveFun(){System.out.println("laugh");}};

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Non, ta classes anonyme n'a pas le nom de ton interface (elle n'a pas de nom, puisqu'elle est anonyme ).
    Ceci dit, si tu fouilles un peu, tu découvriras qu'en fait, elle porte un nom du style "MaClass$1" où MaClasse est le non de la classe dans laquelle tu la déclares, indépendemment de l'interface implémentée.

    Après, que tu butes un peu sur la syntaxe n'a rien d'anormal.

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par nuriel2 Voir le message
    Et cela est sous-entendu parce que la classe a le meme nom que l'interface ? C'est juste ce point qui me gratte les yeux : l'information sur l'interface implemente est embarque dans le "nom" de la classe anonyme. Je ne suis pas sur de comprendre mais je veux bien en admettre le principe.
    C'est en effet une facilité d'écriture. Il faut voir qu'ensuite, ce qui importe c'est le côté pratique de la chose ; ton instance de classe anonyme sera référencée par son interface, et ça permet de n'avoir qu'une seule syntaxe qui ne différencie pas l'héritage anonyme et l'implémentation anonyme d'interface.
    Je conçois aussi que ça puisse faire bizarre au début, mais c'est tellement pratique d'utilisation que la logique saute aux yeux par la suite

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Deaf Voir le message
    Ceci dit, si tu fouilles un peu, tu découvriras qu'en fait, elle porte un nom du style "MaClass$1" où MaClasse est le non de la classe dans laquelle tu la déclares, indépendemment de l'interface implémentée.
    En effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nuriel2@jupiter:$ javac Enjoy.java 
    nuriel2@jupiter:$ ls
    Enjoy$1.class  Enjoyable.class  Enjoy.class  Enjoy.java
    nuriel2@jupiter:$
    A force d'habittude, ce code ne me choquera bientot plus. Merci a tous les deux pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. instancier une interface
    Par new_wave dans le forum Débuter
    Réponses: 2
    Dernier message: 26/04/2013, 11h30
  2. Réponses: 0
    Dernier message: 19/12/2009, 20h51
  3. Reproduire une interface à base de TabControl, possible ?
    Par Tuttu dans le forum Windows Forms
    Réponses: 27
    Dernier message: 22/10/2009, 06h46
  4. Réponses: 4
    Dernier message: 05/05/2008, 11h43
  5. Réponses: 12
    Dernier message: 20/01/2006, 20h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo