11
votes

Java Generic Type

Quand j'ai une interface

public class Bar implements Foo<Bar>  {
    Bar someMethod() {
        return new Bar();
    }
}


0 commentaires

4 Réponses :


-4
votes

Je ne peux pas soumettre un simple "n °" Sur ce site (corps trop court), alors voilà.

NO.


0 commentaires

15
votes

Non, vous ne pouvez pas vous référer à la classe d'implémentation. Le mieux que vous puissiez faire est de: xxx

faisant cela, vous pouvez être sûr que SOMEMETHOD () renvoie un objet qui implémente foo .


EDIT:

Même avec une définition d'interface comme ceci: xxx vous peut définir une classe bar2 xxx

, puis vous pouvez définir une classe bar qui implémente foo mais ne retourne pas bar mais bar2 : xxx

la question initiale était si vous pouviez vous préparer à la Utilisation de l'interface comme bar a fait.

et la réponse est la suivante: non.

EDIT:

Angelika Langer donne Une belle explication de Comment puis-je décrypter "Enum >" ?


6 commentaires

Parce que vous n'avez pas répondu à la question de l'OP. La question de l'OP a posé: Comment pouvez-vous vous assurer que avec un type bar qui implémentée foo , il ne pouvait implémenter que "code> foo , et non foo (par exemple). Ceci est possible et est fait avec java.util.enum , par exemple.


Parce que tu as tort? La réponse suivante ci-dessous montre un lien vers un motif et des exemples de modèles récurrents de travail garantissant que la classe d'implémentation utilise la classe de base, par opposition à n'importe quelle ancienne classe ..


Pourquoi cela est accepté, c'est au-delà de moi. L'OP devrait vraiment clarifier sa question plus réelle.


J'ai ajouté un exemple pourquoi la réponse de @ Chris-Jester-Young n'est pas meilleure que la mienne.


Vous avez raison, merci pour le contre-exemple. Je vais mettre à jour ma réponse. Il y a toujours une différence entre l'utilisation d'utiliser contre , mais qui ne fait que fractionnement de cheveux à ce stade et ne change pas sensiblement le caractère de la réponse .


Cette réponse est correcte et la réponse acceptée est incorrecte.




26
votes

Oui, cela peut être fait (en quelque sorte; voir ci-dessous). strong> (dans le monde C ++, cela s'appelle " modèle de modèle récurrent curieusement récurrent ", mais il s'applique aussi en Java):

public interface Recur<T extends Recur<T>> {
    T foo();
}

class A implements Recur<B> {
    @Override
    public B foo() {
        return new B();
    }
}

class B implements Recur<A> {
    @Override
    public A foo() {
        return new A();
    }
}


1 commentaires

Pour la réponse: +1; pour la descendre des autres réponses: -1; Pour l'admettre: +1 = +1