为什么接口的泛型方法可以在Java中实现为非泛型方法?
假设我们有几个测试接口/类,如下所示:为什么接口的泛型方法可以在Java中实现为非泛型方法?,java,generics,java-8,generic-constraints,Java,Generics,Java 8,Generic Constraints,假设我们有几个测试接口/类,如下所示: abstract class Plant { public abstract String getName(); } interface Eatable { } class Apple extends Plant implements Eatable { @Override public String getName() { return "Apple"; } } class Rose extends
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);
}
class Human implements Animal {
@Override
public void eat(Plant plant) {
}
}
这很好。您可以看到Human.eat
比Animal.eat
受到的约束更小,因为Eatable
界面丢失
问题1:为什么编译器不抱怨这种不一致性
问题2:如果编译器可以接受Plant&Eatable
降级为Plant
,为什么它会抱怨eat(对象植物)
?
据他说
publicstaticAhmed的答案是对的,顺便说一下,如果你想对Animal接口的实现进行约束,你应该声明如下:
interface Animal<T extends Plant & Eatable> {
void eat(T plant);
}
界面动物{
void-eat(T-plant);
}
然后,如果您实现动物接口而不提供类型信息,编译器将使用最小意外策略推断T为植物类型。但是如果您提供了必要的类型信息,编译器就可以正常工作
class Human implements Animal<Rose> // won't compile
class Human implements Animal<Apple> // compile
class Human implements Animal//将不编译
类Human实现Animal//compile
您使用的是哪个版本的Java。在eclipse中使用Java 1.8会产生预期的编译时错误。@Intellij IDEA中的Codebender Java8。@Codebender我在编译时没有问题@ElliottFrisch但它发生在编译阶段,编译器知道这一点,我认为它应该给出一个错误,至少是一个警告?这就是@ElliottFrisch刚才说的。
class Human implements Animal<Rose> // won't compile
class Human implements Animal<Apple> // compile