Java泛型和原始类型

时间:2014-11-04 10:42:49

标签: java generics raw-types

我有下一个代码:

ArrayList value = new ArrayList<Integer>();  // 1
value.add("Test");  // 2

我正在尝试理解第2行。虽然我可以看到value.add("Test");编译没有错误,但我看不出它不会抛出运行时异常的原因。如果value引用了通用ArrayList对象,为什么Java允许向其添加String?任何人都可以向我解释一下吗?

我发现的最近的解释是here,但我仍然不明白核心原因:

Stack s = new Stack<Integer>()
     

这是从参数化类型到原始类型的合法转换。您将能够推动任何类型的价值。但是,任何此类操作都会导致“未经检查的呼叫”警告。

2 个答案:

答案 0 :(得分:6)

通用类型为erased during compilation。因此,在运行时,无论您是否将其定义为通用,ArrayList都是原始ArrayList

在您的情况下,代码编译为您的ArrayList声明不是通用的,并且由于类型擦除而运行正常。

答案 1 :(得分:2)

ArrayList value这是你的类型声明,它不是通用的。这就是编译器允许您将任何对象添加到列表中的原因。