j'ai deux interfaces qui ressemblent à ceci:covariance Java de type automatique de retour avec subclassing générique
interface Parent<T extends Number> {
T foo();
}
interface Child<T extends Integer> extends Parent<T> {
}
Si j'ai un objet Parent
brut, appelant foo()
par défaut de retourner un Number
car il n'y a aucun paramètre de type.
Parent parent = getRawParent();
Number result = parent.foo(); // the compiler knows this returns a Number
Cela a du sens.
Si j'ai un objet Child
brut, je m'attendrais à ce que l'appel foo()
retournerait un Integer
par la même logique. Cependant, le compilateur prétend qu'il renvoie un Number
.
Child child = getRawChild();
Integer result = child.foo(); // compiler error; foo() returns a Number, not an Integer
Je peux passer outre Parent.foo()
dans Child
pour résoudre ce problème, comme ceci:
interface Child<T extends Integer> extends Parent<T> {
@Override
T foo(); // compiler would now default to returning an Integer
}
Pourquoi cela? Y at-il un moyen d'avoir Child.foo()
par défaut pour retourner un Integer
sans déroger Parent.foo()
?
EDIT: Le pré-classement Integer
n'est pas définitif. Je viens de choisir Number
et Integer
comme exemples, mais de toute évidence, ils n'étaient pas le meilleur choix. : S
Je pense que c'est parce que sans le remplacement de l'enfant, l'enfant hérite de la méthode 'foo' du parent, et, selon le parent,' T' est un 'Number'. Pour 'foo' dans le parent de retourner un' Integer', il aurait besoin de connaître les informations sur sa ou ses classe (s) enfant (s), ce qui rompt la hiérarchie ... –
try 'interface Enfant extends Parent < T étend Integer> ' –
fukanchik
@fukanchik qui n'est même pas valide Java. –