1

在 Java 10 中,这给了我一个警告——

ArrayList a = new ArrayList<>();
a.add(23);
a.add("str");

“ArrayList 是原始类型。对泛型类型 ArrayList 的引用应参数化”

原因是Generic落后,但是对于这段代码

var b = new ArrayList<>();//Object type
b.add(3);
b.add("string");

为什么编译器没有给出任何警告?

注意:-我知道var仅限于方法范围。只是想知道 var 的泛型设计概念

Edit1 :- 不要标记为重复,因为我只是想了解内部设计以及为什么 java 没有为 var 添加通用内容?

4

2 回答 2

12

下面是编译器计算类型的方式

var b = new ArrayList<>();

它首先计算初始化器的独立类型。因为初始化程序是菱形调用,所以我们必须使用推理。所以我们引入一个推理变量alpha,RHS 上的类型是ArrayList<alpha>。现在我们必须解决alpha.

为了解决,我们收集约束。我们从原始约束开始alpha <: Object(因为所有类型变量都是引用类型)。然后我们查看构造函数 args(那里什么都没有)和目标类型(那里什么都没有)来收集约束。所以我们唯一的约束是alpha <: Object,所以我们选择alpha=Object,然后ArrayList<Object>上 RHS。那是 的类型b

这里没有原始类型,因此没有警告。

于 2018-04-24T07:20:22.863 回答
0

因为它是一个ArrayList<Object>. Object是 Java 中代表任何类型的顶级类型,因此将任何内容添加到列表中总是安全的。

在第一个示例中,您收到警告,因为您使用了原始类型。原始类型是 Java 中的遗留类型,仅用于向后兼容。你不应该使用它们。

于 2018-05-26T15:14:10.360 回答