Java - 启动没有泛型类型的泛型变量;

时间:2011-09-07 05:21:02

标签: java generics

请您解释一下这些声明之间的区别:

List<Number> test = new ArrayList<Number>();
List<Number> test1 = new ArrayList();
test.add(new Integer(10));
test1.add(new Integer(10));
//test.add(new Object());
//test1.add(new Object());

第2次调用add方法工作正常,最后2次失败。 还有什么别的,除了第二次初始化时的编译警告吗?

我是否理解编译时类型安全是基于变量类型(而不是引用的对象类型)?

提前谢谢。

2 个答案:

答案 0 :(得分:4)

以下两个声明之间没有运行时差异:

List<Number> test = new ArrayList<Number>();
List<Number> test1 = new ArrayList();

正如您所发现的那样,第二个中存在编译时警告。

JVM无法在运行时强制执行以下事实:您只需要将数字添加到testtest1,因此它会在编译时执行所有检查。这种类型在编译成JVM字节代码时消失的事实称为类型擦除。

你是正确的,所有这些检查都是在编译时进行的,而这种检查确实是由你所分配的变量类型驱动的,在你的情况下是List<Number>。您可以将Integer对象添加到这些列表中,但不能添加Object对象。编译器检测到这一点并发出错误。

您可能需要尝试以下方法深入挖掘您的问题:

Object x = new Integer(100);
test.add(x);

答案 1 :(得分:1)

  

我是否理解编译时类型安全性是基于的   变量类型(而不是引用的对象类型)?