在Java 10中,这给了我一个警告 -
ArrayList a = new ArrayList<>();
a.add(23);
a.add("str");
&#34; ArrayList是原始类型。对泛型类型ArrayList的引用 应参数化&#34;
原因是Generic落后,但对于这段代码
var b = new ArrayList<>();//Object type
b.add(3);
b.add("string");
为什么编译器没有给出任何警告?
注意 : - 我知道var
仅限于方法范围。只是想知道切换到var的泛型的设计概念
Edit1 : - 不要像我刚想了解内部设计那样重复标记,以及为什么java没有为var添加通用内容?
答案 0 :(得分:9)
以下是编译器如何计算
的类型var b = new ArrayList<>();
首先计算初始化程序的独立类型。因为初始化程序是钻石调用,所以我们必须使用推理。因此,我们引入了推理变量alpha
,RHS上的类型为ArrayList<alpha>
。现在我们必须解决alpha
。
要解决,我们收集约束。我们从alpha <: Object
的原始约束开始(因为所有类型变量都是引用类型)。然后我们查看构造函数args(没有任何内容)和目标类型(没有任何东西)来收集约束。因此,我们唯一的约束是alpha <: Object
,因此我们选择alpha=Object
,并在RHS上获取ArrayList<Object>
。这是b
的类型。
这里没有原始类型,因此没有警告。
答案 1 :(得分:0)
因为它是ArrayList<Object>
。 Object
是Java中代表任何类型的顶级类型,因此向列表中添加任何内容始终是安全的。
在第一个示例中,您收到警告,因为您使用的是原始类型。原始类型在Java中是遗留的,仅用于向后兼容。你不应该使用它们。