var 不会对泛型给出警告
var does not give a warning for generic
在 Java 10 中,这是给我一个警告 -
ArrayList a = new ArrayList<>();
a.add(23);
a.add("str");
"ArrayList is a raw type. References to generic type ArrayList
should be parameterized"
而后面的原因是Generic,但是对于这段代码
var b = new ArrayList<>();//Object type
b.add(3);
b.add("string");
为什么编译器没有给出任何警告?
注意:- 我知道 var
仅限于方法范围。只是想知道为 var
切除泛型的设计概念
Edit1:- 不要标记为重复,因为我只是想了解内部设计以及为什么 java没有为 var 添加通用的东西?
下面是编译器如何计算
的类型
var b = new ArrayList<>();
它首先计算初始化程序的独立类型。因为初始化程序是菱形调用,所以我们必须使用推理。所以我们引入一个推理变量alpha
,RHS上的类型是ArrayList<alpha>
。现在我们必须求解 alpha
。
为了解决问题,我们收集了约束条件。我们从 alpha <: Object
的原始约束开始(因为所有类型变量都是引用类型)。然后我们查看构造函数参数(那里什么都没有)和目标类型(那里什么也没有)来收集约束。所以我们唯一的限制是 alpha <: Object
,所以我们选择 alpha=Object
,并在 RHS 上得到 ArrayList<Object>
。那就是b
的类型。
这里没有原始类型,因此没有警告。
因为它是一个ArrayList<Object>
。 Object
是 Java 中的顶级类型,代表任何类型,因此向列表中添加任何内容总是安全的。
在第一个示例中,您收到警告是因为您使用了原始类型。原始类型是 Java 中的遗留类型,仅用于向后兼容。你不应该使用它们。
在 Java 10 中,这是给我一个警告 -
ArrayList a = new ArrayList<>();
a.add(23);
a.add("str");
"ArrayList is a raw type. References to generic type ArrayList should be parameterized"
而后面的原因是Generic,但是对于这段代码
var b = new ArrayList<>();//Object type
b.add(3);
b.add("string");
为什么编译器没有给出任何警告?
注意:- 我知道 var
仅限于方法范围。只是想知道为 var
Edit1:- 不要标记为重复,因为我只是想了解内部设计以及为什么 java没有为 var 添加通用的东西?
下面是编译器如何计算
的类型var b = new ArrayList<>();
它首先计算初始化程序的独立类型。因为初始化程序是菱形调用,所以我们必须使用推理。所以我们引入一个推理变量alpha
,RHS上的类型是ArrayList<alpha>
。现在我们必须求解 alpha
。
为了解决问题,我们收集了约束条件。我们从 alpha <: Object
的原始约束开始(因为所有类型变量都是引用类型)。然后我们查看构造函数参数(那里什么都没有)和目标类型(那里什么也没有)来收集约束。所以我们唯一的限制是 alpha <: Object
,所以我们选择 alpha=Object
,并在 RHS 上得到 ArrayList<Object>
。那就是b
的类型。
这里没有原始类型,因此没有警告。
因为它是一个ArrayList<Object>
。 Object
是 Java 中的顶级类型,代表任何类型,因此向列表中添加任何内容总是安全的。
在第一个示例中,您收到警告是因为您使用了原始类型。原始类型是 Java 中的遗留类型,仅用于向后兼容。你不应该使用它们。