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