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合并.
我\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 的讨论。
从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
\n- \n
\xe2\x80\xa6(省略了五个不适用的项目符号)
- \n
否则,约束简化为 \xe2\x80\xb9S <: T\xe2\x80\xba。
\xc2\xa0
\n\n\n\n\n\xc2\xa718.2.3。子类型化约束
\n\n\xe2\x80\xb9S <: T\xe2\x80\xba 形式的约束公式简化如下:
\n\n\n
\n- \n
\xe2\x80\xa6(省略五个不相关的项目符号)
- \n
否则,约束按照以下形式减少
\n\nT:\n
- 如果
\nT是参数化类或接口类型,或者参数化类或接口类型的内部类类型(直接或间接),则设 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..
SoArrayList<\xce\xb1> \xe2\x86\x92 List<String>首先简化为ArrayList<\xce\xb1> <: List<String>,然后,由于是一个参数化接口,因此识别出List<String>相应的超类型,这将是,然后,约束被简化为每个相应类型参数的一组约束(这里我们只有一个),所以我们得到.ArrayList<\xce\xb1>List<\xce\xb1>\xce\xb1 <= String
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |