2014-11-04 105 views
4

我有下面的代码:Java的泛型和原始类型

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

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

我发现这个最接近的解释说明here,但我还是不明白的核心原因:

Stack s = new Stack<Integer>() 

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

回答

6

通用类型是erased duringcompilation。所以在运行时,ArrayList是原始的ArrayList,无论你是否将其定义为通用的。

在你的情况下,代码编译为你的ArrayList声明不是通用的,并且由于类型擦除它运行良好。

+0

感谢您的回复! – Bleyder 2014-11-04 11:09:35

2

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

+0

感谢您的回应! – Bleyder 2014-11-04 11:10:59