【发布时间】:2012-09-13 20:23:10
【问题描述】:
在 Kathy Sierra 关于 SCJP 的书中,我们了解到,当我们写作时
List <A> list = new ArrayList <A> ();
这意味着这个列表将只接受类型 A 的元素,而不是它的子类型或超类型,只接受类型 A。然后我遇到了这个例子
import java.util.*;
interface A {
public void a();
}
class B implements A {
public void a() { }
public void b() { }
}
class C extends B {
public void a() { }
}
class D extends C {
}
public class Generics {
public static void main() {
List <B> lst = new ArrayList <B> ();
lst.add(new B());
lst.add(new C());
lst.add(new D());
}
}
这里已经用 B 声明了一个列表作为它的绑定类型。但它看起来也接受它的子类型的对象。为什么会这样?如果可能,那么这个声明在 java 中是否可用
List <? extends B> list = new ArrayList <B> ();
现在我们用这个符号告诉编译器任何扩展 B 的类型都可以进入这个列表。请帮忙,我真的很困惑
【问题讨论】:
-
别忘了泛型是一个纯粹的编译时特性;您在字节码(已编译的类)中看不到任何通用内容。这称为类型擦除:docs.oracle.com/javase/tutorial/java/generics/erasure.html