为什么接口的泛型方法可以在Java中实现为非泛型?

Che*_*hen 14 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 Plant {
    @Override
    public String getName() {
        return "Rose";
    }
}

interface Animal {
    <T extends Plant & Eatable> void eat(T plant);
}
Run Code Online (Sandbox Code Playgroud)

您可以看到Animal.eat具有约束的通用方法.现在我的Human班级是这样的:

class Human implements Animal {
    @Override
    public void eat(Plant plant) {
    }
}
Run Code Online (Sandbox Code Playgroud)

编译好.你可以看到Human.eat比限制较少Animal.eat,因为Eatable接口丢失.

Q1:为什么编译器不抱怨这种不一致?

Q2:如果Plant&Eatable 降级Plant编译器可以接受,为什么会抱怨eat(Object plant)

小智 12

课程:Gilad Bracha的仿制品 据他说

public static <T extends Object & Comparable<? super T>> T max(Collection<T> coll)
Run Code Online (Sandbox Code Playgroud)

这是使用语法T1和T2 ...&Tn为类型参数提供多个边界的示例.已知具有多个边界的类型变量是绑定中列出的所有类型的子类型.当使用多边界时,边界中提到的第一种类型用作类型变量的擦除.

所以你的例子<T extends Plant & Eatable> void eat(T plant);将被删除,void eat(Plant plant);所以当你覆盖它时,编译器不会抱怨