Est-ce que quelqu'un sait la réponse définitive à pourquoi ce qui suit n'est pas autorisé par le compilateur java?Méthode générique Covariance - restriction valide ou supervision du compilateur?
class BaseClass {
public <T extends Number> T getNumber(){
return null;
}
}
class SubClass extends BaseClass{
@Override
public <T extends Integer> T getNumber(){
return null;
}
}
cela provoque le compilateur de se plaindre avec:
« La méthode getNumber() de type SubClass doit passer outre une méthode superclasse »
Maintenant, quand je mets à mes collègues certains ont essayé pour expliquer que cela va causer de la confusion avec le compilateur. Cependant, comme cela a également été souligné, ce qui suit, conceptuellement similaire, est compilable.
class BaseClass<T extends Number> {
public T getNumber(){
return null;
}
}
class SubClass<T extends Integer> extends BaseClass<T>{
@Override
public T getNumber(){
return null;
}
}
Cela peut être abusé si la sous-classe appelle la super-implémentation, mais le compilateur fournit un avertissement à cet effet. Ma seule conclusion est que c'est un oubli de compilateur de la part des gens de Sun (je ne peux pas me résoudre à dire Oracle: -S).
Quelqu'un at-il la réponse définitive à celui-ci? Supposons qu'il soit en effet permis d'ajouter plus de restrictions au paramètre de type sur une classe dérivée.
Aah oui, nous aimons tous Sun mais l'Oracle? (Laissez-moi me taire maintenant) .... lol –
Notez que '' n'a pas beaucoup de sens puisque 'Integer' est final. Vous pourriez par exemple le changer de 'Integer' à' BigInteger' ou quelque chose comme ça ... –
aioobe