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

psa*_*ora 6 java type-inference language-specifications java-8

我正在阅读java 8语言规范类型推断.它说

List<String> ls = new ArrayList<>()
Run Code Online (Sandbox Code Playgroud)

将首先减少

ArrayList<?> -> List<String>
Run Code Online (Sandbox Code Playgroud)

然后到

? <= String
Run Code Online (Sandbox Code Playgroud)

最后到

? = String
Run Code Online (Sandbox Code Playgroud)

我很难理解减少约束的方式

ArrayList<?> -> List<String> to ? <= String
Run Code Online (Sandbox Code Playgroud)

是派生的.如果有人能够使用java 8语言规范指出逻辑,那将是一个很大的帮助.

是减少的链接


谢谢#Holger的解释.以下是我的推导

new ArrayList<> -> List<String> to ArrayList<?> -> List<String>
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我.

首先找到我们使用的构造函数的临时方法#15.9.3

  • 否则,构造函数的参数是类实例创建表达式的参数列表中的参数(如果有),它们按照它们在表达式中出现的顺序.

  • 如果类实例创建表达式使用<>来删除类类型参数,则为了重载解析和类型参数推断而定义方法列表m1 ... mn.

然后使用#18.5.2导出

ArrayList<?> -> List<String>
Run Code Online (Sandbox Code Playgroud)

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

  • 否则,约束公式<Rθ→T>减小并与B2合并.

Hol*_*ger 4

我\xe2\x80\x99m很高兴你没有\xe2\x80\x99问如何从到new ArrayList<>() \xe2\x86\x92 List<String>as ArrayList<\xce\xb1> \xe2\x86\x92 List<String>,虽然看起来很明显,但根据应用\xc2\xa718.2.1,我们会发现它需要对整个\xc2\进行讨论xa715.9.3,然后是 \xc2\xa718.5.2 的讨论。

\n\n

ArrayList<\xce\xb1> \xe2\x86\x92 List<String>更容易开始:

\n\n
\n

\xc2\xa718.2.2。类型兼容性约束

\n\n

\xe2\x80\xb9S \xe2\x86\x92 T\xe2\x80\xba 形式的约束公式简化如下:

\n\n
    \n
  • \xe2\x80\xa6(省略了五个不适用的项目符号)

  • \n
  • 否则,约束简化为 \xe2\x80\xb9S <: T\xe2\x80\xba。

  • \n
\n
\n\n

\xc2\xa0

\n\n
\n

\xc2\xa718.2.3。子类型化约束

\n\n

\xe2\x80\xb9S <: T\xe2\x80\xba 形式的约束公式简化如下:

\n\n
    \n
  • \xe2\x80\xa6(省略五个不相关的项目符号)

  • \n
  • 否则,约束按照以下形式减少T

    \n\n
      \n
    • 如果T是参数化类或接口类型,或者参数化类或接口类型的内部类类型(直接或间接),则设 A 1 , ..., A n为 的类型实参T。在 的超类型中S,使用类型参数 B 1 , ..., B n来标识相应的类或接口类型。如果不存在这样的类型,则约束减少为false。否则,约束简化为以下新约束:对于所有i (1\xc2\xa0\xe2\x89\xa4\xc2\xa0i\xc2\xa0\xe2\x89\xa4\xc2\xa0n), \xe2\x80 \xb9B\xc2\xa0<=\xc2\xa0A\xe2\x80\xba..
    • \n
  • \n
\n
\n\n

SoArrayList<\xce\xb1> \xe2\x86\x92 List<String>首先简化为ArrayList<\xce\xb1> <: List<String>,然后,由于是一个参数化接口,因此识别出List<String>相应的超类型,这将是,然后,约束被简化为每个相应类型参数的一组约束(这里我们只有一个),所以我们得到.ArrayList<\xce\xb1>List<\xce\xb1>\xce\xb1 <= String

\n