Java泛型和原始类型

Ble*_*der 4 java generics raw-types

我有下一个代码:

ArrayList value = new ArrayList<Integer>();  // 1
value.add("Test");  // 2
Run Code Online (Sandbox Code Playgroud)

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

我在这里描述我发现的最接近的解释,但我仍然不明白核心原因:

Stack s = new Stack<Integer>()
Run Code Online (Sandbox Code Playgroud)

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

xle*_*ier 6

通用类型 编译期间擦除.因此,在运行时,无论您是否将其定义为通用,ArrayList都是原始的ArrayList.

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