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
Run Code Online (Sandbox Code Playgroud)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);所以当你覆盖它时,编译器不会抱怨
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |