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

时间:2016-04-15 04:18:42

标签: java java-8 type-inference language-specifications

我正在阅读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结合。
  •   

1 个答案:

答案 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