繁体   English   中英

Java 8类型推断-如何对通用构造函数进行简化?

[英]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 nT的类型参数。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM