为什么接口的泛型方法可以在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