Rou*_*han 0 java generics local-variables java-10
在Java 10中,这给了我一个警告 -
ArrayList a = new ArrayList<>();
a.add(23);
a.add("str");
Run Code Online (Sandbox Code Playgroud)
"ArrayList是一个原始类型.应该参数化对泛型类型ArrayList的引用"
原因是Generic背后,但对于这个代码
var b = new ArrayList<>();//Object type
b.add(3);
b.add("string");
Run Code Online (Sandbox Code Playgroud)
为什么编译器没有给出任何警告?
注意: - 我知道var仅限于方法范围.只是想知道切换到var的泛型的设计概念
编辑1: - 不要像我想知道的内部设计那样重复标记,以及为什么java没有为var添加泛型内容?
以下是编译器计算类型的方法
var b = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
它首先计算初始化程序的独立类型.因为初始化程序是钻石调用,所以我们必须使用推理.所以我们引入了一个推理变量alpha,RHS上的类型是ArrayList<alpha>.现在我们必须解决alpha.
要解决,我们收集约束.我们从原始约束开始alpha <: Object(因为所有类型变量都是引用类型).然后我们查看构造函数args(没有任何内容)和目标类型(没有任何东西)来收集约束.因此,我们唯一的约束是alpha <: Object,所以我们选择alpha=Object,并获得ArrayList<Object>RHS.那就是那种b.
这里没有原始类型,因此没有警告.