6

我正在阅读 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>

因为是一个 poly 表达式并且没有任何通配符类型参数;

  • 否则,约束公式‹R θ → T›被简化并与B2合并。
4

1 回答 1

4

我很高兴你没有问如何从new ArrayList<>() → List<String>to ArrayList<α> → List<String>as,虽然看起来很明显,根据应用 §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.

于 2016-04-15T13:17:07.930 回答