Java 与类型铸造相关的JLS

Java 与类型铸造相关的JLS,java,generics,casting,Java,Generics,Casting,我试图从根本上理解Java中的类型转换,但无法理解JLS的某些部分尤其是(在将类类型S转换为类或接口类型T的意义上): 此外,如果存在T的超类型X和S的超类型Y,使得X和Y都是可证明不同的参数化类型(§4.5),并且X和Y的擦除相同,则会发生编译时错误 这(在将接口类型S转换为最终类类型T的意义上): 否则,S要么是调用某个泛型类型声明G的参数化类型,要么是对应于泛型类型声明G的原始类型。那么必须存在T的超类型X,这样X就是G的调用,否则会发生编译时错误。 此外,如果S和X是可证明不同的参数化类

我试图从根本上理解Java中的类型转换,但无法理解JLS的某些部分
尤其是(在将类类型S转换为类或接口类型T的意义上):

此外,如果存在T的超类型X和S的超类型Y,使得X和Y都是可证明不同的参数化类型(§4.5),并且X和Y的擦除相同,则会发生编译时错误

这(在将接口类型S转换为最终类类型T的意义上):

否则,S要么是调用某个泛型类型声明G的参数化类型,要么是对应于泛型类型声明G的原始类型。那么必须存在T的超类型X,这样X就是G的调用,否则会发生编译时错误。 此外,如果S和X是可证明不同的参数化类型,则会发生编译时错误

也许有人可以举一些简单的例子来澄清这些摘录

另外,经过@ErickGHagstrom的考虑和指导,我想我可以澄清这两个棘手的JLS摘录

摘录1。 JLS表示:

如果以下任一项为真,则两个参数化类型可证明是不同的:

  • 它们是不同泛型类型声明的参数化

  • 它们的任何类型参数都可以证明是不同的

以及:

如果以下情况之一为真,则两个类型参数是可证明不同的:

  • 两个参数都不是类型变量或通配符,而且两个参数的类型不同

  • 一个类型参数是一个类型变量或通配符,其上限(根据捕获转换(§5.1.10),如有必要)为S;另一个类型参数T不是类型变量或通配符;也不是| S | l1=新的T(); 静态列表和
    列表
    列表
    列表第一种情况:
    
    ArrayList
    ArrayList
    具有相同的擦除率,
    ArrayList
    ,但可以证明是不同的,因为没有
    字符串
    可以转换为
    整数
    ,也没有
    整数
    可以转换为
    字符串

    第二种情况: 设G为
    List
    ,S为
    List
    。假设我有一个类
    MyFinalArrayList
    ,如下所示:

    public final class MyFinalIntArrayList extends ArrayList<Integer> {
        ...
    }
    
    公共最终类MyFinalIntArrayList扩展了ArrayList{
    ...
    }
    
    还有一个

    public final class MyFinalStrArrayList extends ArrayList<String> {
        ...
    }
    
    公共最终类MyFinalStraryList扩展了ArrayList{
    ...
    }
    
    我可以将第一种情况转换为
    列表第一种情况:
    
    ArrayList
    ArrayList
    具有相同的擦除率,
    ArrayList
    ,但可以证明是不同的,因为没有
    字符串
    可以转换为
    整数
    ,也没有
    整数
    可以转换为
    字符串

    第二种情况: 设G为
    List
    ,S为
    List
    。假设我有一个类
    MyFinalArrayList
    ,如下所示:

    public final class MyFinalIntArrayList extends ArrayList<Integer> {
        ...
    }
    
    公共最终类MyFinalIntArrayList扩展了ArrayList{
    ...
    }
    
    还有一个

    public final class MyFinalStrArrayList extends ArrayList<String> {
        ...
    }
    
    公共最终类MyFinalStraryList扩展了ArrayList{
    ...
    }
    

    我可以将第一个强制转换为
    ListSo,如果参数化类型的类型参数不相关,那么它们是可证明不同的?好啊似乎至少第一次提取的理解正在到来:如果两种类型具有可证明的不同参数化超类型,这意味着这两种类型无论如何都不可能在同一个层次分支中。关于第二次提取的答案。将
    MyFinalStraryList
    转换为
    List
    非常简单。我想你的意思是:
    listli1=newmyfinalintarraylist();MyFinalIntArrayList mfli1=(MyFinalIntArrayList)li1
    此代码编译和运行是因为
    MyFinalIntArrayList
    通过扩展
    ArrayList
    有效地实现了
    List
    。但我仍然无法形成想法,也无法理解第二个摘录的确切含义。这个JLS真是令人兴奋。当参数化类型的类型参数为a)非通配符且不相同或b)通配符且哪些边界不相关时,参数化类型是可证明不同的。因此,当参数化类型的类型参数不相关时,参数化类型是可证明不同的?好啊似乎至少第一次提取的理解正在到来:如果两种类型具有可证明的不同参数化超类型,这意味着这两种类型无论如何都不可能在同一个层次分支中。关于第二次提取的答案。将
    MyFinalStraryList
    转换为
    List
    非常简单。我想你的意思是:
    listli1=newmyfinalintarraylist();MyFinalIntArrayList mfli1=(MyFinalIntArrayList)li1
    此代码编译和运行是因为
    MyFinalIntArrayList
    通过扩展
    ArrayList
    有效地实现了
    List
    。但我仍然无法形成想法,也无法理解第二个摘录的确切含义。这个JLS真是令人兴奋。如果参数化类型的类型参数是a)非通配符且不相同,或者b)通配符且哪些边界不相关,则参数化类型是可证明不同的。