假设我们有一些这样的测试接口(interface)/类:

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接口(interface)丢失了。

Q1:为什么编译器不提示这种不一致?

Q2:如果编译器可接受将Plant&Eatable降级为Plant,为什么它会提示eat(Object plant)

最佳答案

Lesson: Generics by Gilad Bracha
按照他的说法



因此您的示例<T extends Plant & Eatable> void eat(T plant);将被擦除为void eat(Plant plant);,因此当您覆盖它时,编译器不会提示

10-05 23:36