让我举个简单的例子:
public class Main {
public static abstract class Food {
}
public static abstract class Fruit extends Food {
public String getJuice(){
return "juice";
}
}
public static abstract class Container<T extends Food> {
private T food;
public final T get(){
return food;
}
}
public static abstract class Crate<T extends Fruit> extends Container<T> {
}
public static void Bar(Crate crate) {
Food f = crate.get(); //compiles fine
//Fruit f2 = crate.get(); //can't compile
}
}
Run Code Online (Sandbox Code Playgroud)
当给出原始类型时,crate.get()返回Food而不是Fruit
Crate被声明为Crate<T extends Fruit> extends Container<T>使Crate<Food>被禁止的.我只是很好奇:为什么方法T get()不返回Fruit?为什么Crate<Fruit>需要?
发生这种情况是因为get声明了Container.当使用原始类型Crate(具有对其所有(继承)方法应用擦除的效果)时,签名public T get()被删除public Food get(),因为它的声明类T具有上限.Food
虽然Crate缩小了上限T,恰好是返回类型get,但它不会覆盖该方法.如果是这种情况,您会看到不同的行为:
public static abstract class Container<T extends Food> {
private T food;
public T get() {
return food;
}
}
public static abstract class Crate<T extends Fruit> extends Container<T> {
@Override
public T get() {
return super.get();
}
}
public static void bar(Crate crate) {
Food f = crate.get(); // compiles fine
Fruit f2 = crate.get(); // also compiles
}
Run Code Online (Sandbox Code Playgroud)
现在,public T get()被删除了public Fruit get(),因为它已被重新声明在T具有上限的类中Fruit.
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |