繁体   English   中英

Java泛型和原始类型

[英]Java Generics and Raw Types

我有下一个代码:

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

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

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

 Stack s = new Stack<Integer>() 

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM