为什么一个List <父类>对象可以浇铸为子类对象?

蛇夫座哈恩:

我发现,情况1和3的情况下可以在没有错误被编译,但病例2(SubClassB延伸SuperClassA,这是抽象类),我不知道是什么,为什么情况1和3的情况下都没有编译错误。如果是JDK错误,为什么情况2不能通过投检查?

// case 1        
List<SuperClassA> a = new ArrayList<>();
SubClassB b = (SubClassB) a; 

// case 2
List<Number> m = new ArrayList<>();
Long n = (Long) m; //Error:(xx,yy) java: incompatible types: java.util.List<java.lang.Number> cannot be converted to java.lang.Long

// case 3
List<Exception> e = new ArrayList<>();
RuntimeException d = (RuntimeException) e;
扫路机:

注意这种情况下,1和3的情况下将在运行时都失败。

在编译时,编译器会抱怨不兼容的类型转换只有在语言规范是这么说的。语言规范允许的情况下1和3,因为他们不会100%的失败。

案例1不会100%的失败,只要编译器而言,因为它认为,a可以包含任何类型的实例实现List<SuperClassA>如果有什么的一个子类,SubclassB真正实现List<SuperClassA>而如果a实际包含的是子类的实例SubclassB随后剧组会成功!

同样的问题也发生在情况2.如果想要什么就有什么的子类RuntimeException真正实现List<Exception>而如果e实际包含的是子类的实例RuntimeException随后剧组会成功!

案例2只显示了一个错误,因为Longfinal不能是一个子类实现List<Number>,所以它肯定会失败。

这是在指定§5.5.1规范(斜体字是相关的位):

给定一个编译时引用类型S(源极)和一个编译时引用类型T(目标),流延转换选自S如果发生没有编译时错误存在至T由于以下规则。

...

如果S是一个接口类型:

  • 如果T是一个数组类型,则S必须是类型java.io.SerializableCloneable(由阵列实现的唯一的接口),或编译时会出现误差。

  • 如果T是不是一个类或接口类型final(§8.1.1),然后,如果存在的T的超类型X,和S的超类型Y,使得X和Y是可证明不同参数化类型,并且所述X和Y的擦除是相同的,则发生编译时间错误。

否则,中投始终是法律在编译时(因为即使T没有实现S,T威力的一个子类)。

  • 如果T是最后一类类型,那么:

    - 如果S不是参数化的类型或原始类型,则T必须实现S,或发生编译时间错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有什么办法可以在JAVA中使用父类的对象来调用子类的构造函数?

为什么不能引用子类对象引用父类对象?

为什么获得父类作为参数调用该方法,而不是一个获取子类作为参数的方法?

有什么方法可以在不修改方法的情况下从Java的子类对象调用父类方法

为什么你可以有类对象的一个HashSet

为什么EnumMap为空值分配一个Object类对象?

为什么允许使用子类的构造函数实例化父类对象?

尽管子类对象调用该方法,为什么“ this”仍引用父类?

为什么子类对象使用的父类方法会导致错误?

为什么父类方法在调用另一个父方法时不传递参数,而子类具有相同名称的方法?

如何声明一个可以作为超类的子类之一的对象的类字段

为什么当我尝试从父类创建子类(向下转换)时,得到一个空对象

如何在我的父类中制作一个对象,但在Perl中将其祝福给我的子类呢?

为什么嵌套一个类使包含类可以访问子类的受保护数据?

如果不在子类中创建子类对象,为什么父类必须具有默认构造函数?

为什么从另一个类调用使用自动装配对象的方法时,该对象为null?

为什么此对象未检测到父类?

子类对象如何访问父类的私有变量,就像java中一样,除了类本身可以访问私有变量之外,否?

将子类的构造函数提供给父类的对象有什么意义?

指向超类对象的指针可以用作指向子类对象的指针。但是不能调用子类的成员函数。为什么?

Java继承:父类的对象实例与2个子类相同

子类需要设置父类的唯一对象字段吗?

为什么我使用 Kotlin 时在密封类中定义了一个对象类?

为什么要在类对象的声明中写一个“类”?

引用父类对象的子类变量

子类Python内的父类对象

子类与父类对象之间的区别?

从子类的ModelForm创建父类对象

检查哪个子类是父类对象