请您解释一下这些声明之间的区别:
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次失败。 还有什么别的,除了第二次初始化时的编译警告吗?
我是否理解编译时类型安全是基于变量类型(而不是引用的对象类型)?
提前谢谢。
答案 0 :(得分:4)
以下两个声明之间没有运行时差异:
List<Number> test = new ArrayList<Number>();
List<Number> test1 = new ArrayList();
正如您所发现的那样,第二个中存在编译时警告。
JVM无法在运行时强制执行以下事实:您只需要将数字添加到test
和test1
,因此它会在编译时执行所有检查。这种类型在编译成JVM字节代码时消失的事实称为类型擦除。
你是正确的,所有这些检查都是在编译时进行的,而这种检查确实是由你所分配的变量类型驱动的,在你的情况下是List<Number>
。您可以将Integer对象添加到这些列表中,但不能添加Object对象。编译器检测到这一点并发出错误。
您可能需要尝试以下方法深入挖掘您的问题:
Object x = new Integer(100);
test.add(x);
答案 1 :(得分:1)
我是否理解编译时类型安全性是基于的 变量类型(而不是引用的对象类型)?
是