假设我们有一些这样的测试接口/类:
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
Q1:为什么编译器不抱怨这种不一致?
Q2:如果编译器可以接受Plant&Eatable
降级,为什么会抱怨?Plant
eat(Object plant)