【问题标题】:Java Generics and Raw TypesJava 泛型和原始类型
【发布时间】:2014-11-04 18:53:56
【问题描述】:

我有下一个代码:

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

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

我找到的最接近的解释描述为here,但我仍然不明白核心原因:

Stack s = new Stack<Integer>()

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

【问题讨论】:

    标签: java generics raw-types


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复!
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复!
    猜你喜欢
    • 2012-04-03
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多