Disons que nous avons quelques interfaces de test/classes comme ceci:Pourquoi une méthode générique d'une interface peut-elle être implémentée comme non générique en Java?
abstract class Plant {
public abstract String getName();
}
interface Eatable { }
class Apple extends Plant implements Eatable {
@Override
public String getName() {
return "Apple";
}
}
class Rose extends Plant {
@Override
public String getName() {
return "Rose";
}
}
interface Animal {
<T extends Plant & Eatable> void eat(T plant);
}
Vous pouvez voir Animal.eat
est une méthode générique avec des contraintes. Maintenant, j'ai ma classe Human
comme ceci:
class Human implements Animal {
@Override
public void eat(Plant plant) {
}
}
qui compile très bien. Vous pouvez voir Human.eat
est moins contrainte que Animal.eat
parce que l'interface Eatable
est perdue.
Q1: Pourquoi le compilateur ne se plaint-il pas de cette incohérence?
Q2: Si Plant&Eatable
révisions à la baisse-Plant
est acceptable pour le compilateur, pourquoi il se plaint sur eat(Object plant)
?
Quelle version de Java utilisez-vous? L'utilisation de Java 1.8 dans Eclipse provoque une erreur de compilation comme prévu. – Codebender
@Codebender Java8 dans Intellij IDEA. –
@Codebender Je n'ai aucun problème à compiler ceci. https://ideone.com/7xUcZn – flakes