我正在阅读java 8语言规范类型推断。它说
List<String> ls = new ArrayList<>()
将首先减少
ArrayList<α> -> List<String>
然后到
α <= String
最后
α = String
我很难理解减少约束的方式
ArrayList<α> -> List<String> to α <= String
是衍生出来的。如果有人能够使用java 8语言规范指出逻辑,那将是一个很大的帮助。
Here's减少的链接
感谢#Holger的解释。以下是我对
的推导new ArrayList<> -> List<String> to ArrayList<α> -> List<String>
如果我错了,请纠正我。
首先找到我们使用#15.9.3
的构造函数的临时方法
否则,构造函数的参数是类实例创建表达式的参数列表中的参数(如果有), 按照它们出现在表达式中的顺序。
如果类实例创建表达式使用&lt;&gt;为了省级类型 参数,方法列表m1 ... mn是为了目的而定义的 重载决策和类型参数推断。
然后#18.5.2用于派生
ArrayList<α> -> List<String>
由于是poly表达式且没有任何通配符类型参数;
- 否则,约束公式
被减少并且与B2结合。
答案 0 :(得分:4)
我很高兴您没有问过如何从new ArrayList<>() → List<String>
到ArrayList<α> → List<String>
,虽然看起来很明显,但根据§18.2.1,我们会发现它需要讨论整个§15.9.3,然后讨论§18.5.2。
从ArrayList<α> → List<String>
开始更容易:
§18.2.2. Type Compatibility Constraints
形式
的约束公式如下:
...(省略了五个不适用的子弹)
否则,约束将减少为
。
§18.2.3. Subtyping Constraints
形式
的约束公式如下:
...(省略了五个不相关的子弹)
否则,约束会根据
的形式减少T
:
- 如果
T
是参数化类或接口类型,或参数化类或接口类型的内部类类型(直接或间接),则让A 1 ,..., n 是T
的类型参数。在S
的超类型中,标识了相应的类或接口类型,类型参数B 1 ,...,B n 。如果不存在此类型,则约束将减少为 false 。否则,约束减少到以下新约束:对于所有 i (1≤i≤n), i &lt; = A i > ..
因此,ArrayList<α> → List<String>
首先缩减为ArrayList<α> <: List<String>
,然后,由于List<String>
是参数化接口,因此会识别相应的超级类型ArrayList<α>
,List<α>
将α <= String
然后,约束被简化为每个对应类型参数的一组约束(这里我们只有一个),因此我们得到query
。