[英]Java 8 Type Inference - How reduction is done for generic constructors?
我正在阅读Java 8语言规范类型推断。 它说
List<String> ls = new ArrayList<>()
将首先减少
ArrayList<α> -> List<String>
然后到
α <= String
最后
α = String
我很难理解如何减少约束
ArrayList<α> -> List<String> to α <= String
是派生的。 如果任何人都可以使用java 8语言规范指出逻辑,那将是一个很大的帮助。
这是减少费用的链接
感谢#Holger的解释。 以下是我对...的推导的看法
new ArrayList<> -> List<String> to ArrayList<α> -> List<String>
如果我错了,请纠正我。
首先找到用于构造函数的临时方法,我们使用#15.9.3
否则,构造函数的参数是类实例创建表达式的参数列表中的参数(如果有),按照它们在表达式中出现的顺序。
如果类实例创建表达式使用<>排除类类型参数,则将定义方法列表m1 ... mn以用于重载解析和类型参数推断。
然后使用#18.5.2推导
ArrayList<α> -> List<String>
由于是一个多边形表达式并且没有任何通配符类型参数;
- 否则,将约束公式‹Rθ→T›简化并与B2合并。
我很高兴您没有问如何new ArrayList<>() → List<String>
到ArrayList<α> → List<String>
因为看起来很明显,每应用§18.2.1,我们就会发现它要求对整个§15.9.3进行讨论,然后再对§18.5.2进行讨论。
从ArrayList<α> → List<String>
比较容易:
§18.2.2。 类型兼容性约束
形式为‹S→T›的约束公式如下所示:
…(省略了五个不适用的项目符号)
否则,约束将减小为‹S <:T›。
第18.2.3条 子类型约束
形式为‹S <:T›的约束公式可简化为:
…(省略了五个无关的项目符号)
否则,根据
T
的形式减少约束:
- 如果
T
是参数化的类或接口类型,或者参数化的类或接口类型的内部类类型(直接或间接),则使A 1 ,...,A n为T
的类型参数。 在S
的超类型中,使用类型参数B 1 ,...,B n标识相应的类或接口类型。 如果不存在这样的类型,则约束条件减少为false 。 否则,约束将减少为以下新约束:对于所有i (1≤i≤n),‹B i <= A i ›。
因此,首先将ArrayList<α> → List<String>
简化为ArrayList<α> <: List<String>
,然后,由于List<String>
是参数化的接口,因此标识了ArrayList<α>
的相应超级类型,该类型将是List<α>
,然后,对于每个对应的类型参数(这里只有一个),约束被简化为一组约束,因此我们得到α <= String
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.