假设我们有一些这样的测试接口/类:
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:为什么编译器不抱怨这种不一致?
问题2:如果Plant&Eatable
降级到Plant
编译器可接受的水平,为什么会抱怨eat(Object plant)
?
public static <T extends Object & Comparable<? super T>> T max(Collection<T> coll)
这是使用语法T1&T2 ...&Tn为类型参数赋予多个范围的示例。已知具有多个界限的类型变量是界限中列出的所有类型的子类型。当使用多重边界时,边界中提到的第一个类型将用作类型变量的擦除。
因此您的示例<T extends Plant & Eatable> void eat(T plant);
将被删除,void eat(Plant plant);
因此当您覆盖它时,编译器不会抱怨
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句