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]
    是将类型参数(of
    G
    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——我对它们的看法