【发布时间】:2016-08-10 02:49:11
【问题描述】:
假设我们有几个这样的测试接口/类:
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)?
【问题讨论】:
-
您使用的是哪个版本的 Java。在 Eclipse 中使用 Java 1.8 会产生预期的编译时错误。
-
@Codebender Java8 in Intellij IDEA。
-
@Codebender 我编译这个没有问题。 ideone.com/7xUcZn
-
@ElliottFrisch 但它发生在编译阶段,编译器知道这一点,我认为它应该给出一个错误,至少是一个警告?
-
这正是@ElliottFrisch 刚才所说的。
标签: java generics java-8 generic-constraints