Java 理解捕获转换
我试图理解捕获的转换如何适用于通配符类型。有一节解释: 让Java 理解捕获转换,java,generics,Java,Generics,我试图理解捕获的转换如何适用于通配符类型。有一节解释: 让G命名一个泛型类型声明(§8.1.2,§9.1.2),该声明带有n类型参数A1,…,一个带有相应边界U1,…,Un 存在参数化类型的捕获转换 G(§4.5)转换为参数化类型G,其中,对于1≤ 我≤ n: 如果Ti是形式为?的通配符类型参数(§4.5.1),则Si是 其上限为Ui[A1:=S1,…,An:=Sn]的新类型变量,以及 其下限为null类型(§4.1) 如果Ti是形式为的通配符类型参数?扩展Bi,然后扩展Si 一个新类型变量,
G
命名一个泛型类型声明(§8.1.2,§9.1.2),该声明带有n
类型参数A1,…,一个带有相应边界U1,…,Un
存在参数化类型的捕获转换
G
(§4.5)转换为参数化类型G
,其中,对于1≤ 我≤ n
:
- 如果
Ti
是形式为?
的通配符类型参数(§4.5.1),则Si
是
其上限为Ui[A1:=S1,…,An:=Sn]
的新类型变量,以及
其下限为null
类型(§4.1)
如果Ti
是形式为的通配符类型参数?扩展Bi
,然后扩展Si
一个新类型变量,其上限为glb(Bi,
Ui[A1:=S1,…,An:=Sn])
且其下限为null
类型
glb(V1,…,Vm)
被定义为V1&…&虚拟机
对于任何两个类(非接口)Vi
而Vj
,Vi
不是Vj
的子类,反之亦然
Ti
是形式为的通配符类型参数?超级Bi
,那么Si
是一个
其上限为Ui[A1:=S1,…,An:=Sn]的新类型变量,以及
其下限为Bi
Si=Ti
Ui[A1:=S1,…,An:=Sn]
。这是什么意思?我在JLS中找不到这种搜索的定义。它意味着用实际类型“替换”类型变量。比如说
List<T>[T:=String] => List<String>
Enum<E extends Enum<E>>
A1=E
U1=Enum<E>
Enum<?> capture convertion to Enum<S1>
U1[A1:=S1] => Enum<S1>
S1's upper bound is Enum<S1>
List[T:=String]=>List
枚举
A1=E
U1=枚举
枚举捕获转换为枚举
U1[A1:=S1]=>枚举
S1的上界是Enum
语法很可能是从首先借用的:定义替换
[A1:=S1,…,An:=Sn]
是a,定义为:
符号[F1:=T1,…,Fn:=Tn]
表示用Ti
替换1≤ 我≤ n
语句:[A1:=S1,…,An:=Sn]
是将类型参数(ofG
)Ai
替换为1的类型变量Si
≤ 我≤ n
。(另见脚注†)
<强>下:< /强>考虑为什么在第一种情况下我们可能需要替换。从(添加高亮显示以使下一点回家):
让G
命名一个泛型类型声明。。。使用n
类型参数A1,…,一个带有相应边界的U1,…,Un
即:
- 边界
U1,…,Un
专门对应于类型参数A1,…,An
- 未说明的推论:边界
U1,…,Un
与类型变量S1,…,Sn
不对应
把它放在一起:我现在说的是显而易见的,因为我相信你在我前面,但是
关于“Ti
是一个通配符类型的参数…形式为?
”)的规则
Si
是一个新类型变量,其上限为Ui[A1:=S1,…,An:=Sn]
Si
是一个新类型变量
- 其上限为
Ui
- 其中(这是隐含位)
- 类型参数
A1,…,一个U1,…,Un
专门对应于
- 已替换为类型变量
S1,…,Sn
- 使
U1,…,Un
对应于类型变量S1,…,Sn
TL;博士
i、 e.这只是意味着原始的上界Ui
也是Si
脚注
†回想一下类型变量和类型参数不是一回事是很有帮助的(因此我们可以开始了解为什么需要替换):
类型变量是用作类、接口、方法中的类型的非限定标识符,
以及建造机构
类型变量是通过泛型类、接口、方法或构造函数的类型参数的声明引入的
可能是@RamanShrivastava的复制品不幸的是,它不是。我询问了定义的具体部分。如果您在开始处添加额外的上下文,让G命名一个通用类型声明(§8.1.2,§9.1.2),其中包含n个类型参数A1,…,一个具有相应边界U1,…,Un。用户界面所指的内容变得更清晰了。@OldCurmudgeon-也许可以加上“…再加上一点摸索,Ui
所指的内容变得更清晰了”!顺便说一句,你不能添加一个非新类型变量的例子吗?对不起@DmitryBundin,我不明白你的意思。您提到的部分只讨论了“新类型变量Si”?我的意思是Si是新类型变量的限制是否重要。我不明白他们为什么会提到这一点。@DmitryBundin他们只是说,Si
没有从其他地方重用,它是为捕获声明的全新类型变量。这就是为什么两个看起来应该相同的捕获不一样的原因——它们有不同的捕获类型变量。@AndyBrown——我对它们的看法