假设我们有一些这样的测试接口(interface)/类:
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);
}
您可以看到
Animal.eat
是带有约束的通用方法。现在我有了Human
类,如下所示:class Human implements Animal {
@Override
public void eat(Plant plant) {
}
}
编译良好。您会看到
Human.eat
的约束比Animal.eat
少,因为Eatable
接口(interface)丢失了。Q1:为什么编译器不提示这种不一致?
Q2:如果编译器可接受将
Plant&Eatable
降级为Plant
,为什么它会提示eat(Object plant)
? 最佳答案
Lesson: Generics by Gilad Bracha
按照他的说法
因此您的示例<T extends Plant & Eatable> void eat(T plant);
将被擦除为void eat(Plant plant);
,因此当您覆盖它时,编译器不会提示