2011-09-07 122 views
1

能否请您解释这些声明之间的区别:Java - 启动不具有泛型类型的泛型变量;

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()); 

的add方法做工精细第2调用,最后2失败。 除第二次初始化时编译警告外,还有其他的东西吗?

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

预先感谢您。

+0

我不知道,如果你TEST1的附加整数,会是一个对象或一个整数 –

+0

在运行时,它将永远是一个Object,并添加(通过编译器)强制转换为(Integer) – StKiller

回答

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

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

是的。