Java 与类型铸造相关的JLS
我试图从根本上理解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是可证明不同的参数化类
尤其是(在将类类型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为字符串
,S为List
。假设我有一个类List
,如下所示:MyFinalArrayList
public final class MyFinalIntArrayList extends ArrayList<Integer> { ... }
还有一个公共最终类MyFinalIntArrayList扩展了ArrayList{ ... }
public final class MyFinalStrArrayList extends ArrayList<String> { ... }
我可以将第一种情况转换为公共最终类MyFinalStraryList扩展了ArrayList{ ... }
列表第一种情况:
与ArrayList
具有相同的擦除率,ArrayList
,但可以证明是不同的,因为没有ArrayList
可以转换为字符串
,也没有整数
可以转换为整数
第二种情况: 设G为字符串
,S为List
。假设我有一个类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
。但我仍然无法形成想法,也无法理解第二个摘录的确切含义。这个JLS真是令人兴奋。当参数化类型的类型参数为a)非通配符且不相同或b)通配符且哪些边界不相关时,参数化类型是可证明不同的。因此,当参数化类型的类型参数不相关时,参数化类型是可证明不同的?好啊似乎至少第一次提取的理解正在到来:如果两种类型具有可证明的不同参数化超类型,这意味着这两种类型无论如何都不可能在同一个层次分支中。关于第二次提取的答案。将List
转换为MyFinalStraryList
非常简单。我想你的意思是:List
此代码编译和运行是因为listli1=newmyfinalintarraylist();MyFinalIntArrayList mfli1=(MyFinalIntArrayList)li1
通过扩展MyFinalIntArrayList
有效地实现了ArrayList
。但我仍然无法形成想法,也无法理解第二个摘录的确切含义。这个JLS真是令人兴奋。如果参数化类型的类型参数是a)非通配符且不相同,或者b)通配符且哪些边界不相关,则参数化类型是可证明不同的。List