var不会给泛型发出警告

时间:2018-04-19 19:25:47

标签: java generics local-variables java-10

在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添加通用内容?

2 个答案:

答案 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中是遗留的,仅用于向后兼容。你不应该使用它们。