Java中的转换和继承

Jes*_*mes 4 java inheritance casting

考虑这个简单的代码:

class A {}

class B extends A {}

public class TestClass {
    public static void main(String args[]) {
        A[] a, a1;
        B[] b;
        a = new A[10];
        a1 = a;
        b = new B[20];
        a = b; // 1
        b = (B[]) a; // 2
        b = (B[]) a1; // 3
    }
}
Run Code Online (Sandbox Code Playgroud)

仔细查看我评论1,2和3的行.在编译期间将允许第1行,因为赋值是从子类引用到超类引用完成的.

第2行中的强制转换是必需的,因为超类引用被分配给子类引用变量.这在运行时工作,因为a引用的对象实际上是B的数组(第1行).

现在,这就是我的困惑所在:第3行将抛出java.lang.ClassCastException.现在,这意味着在运行时,程序意识到实际对象不是B的数组,而是A的数组.

这正是我不明白的地方.B不延伸A吗?所以它满足条件B IS-A A,对吗?因此,第3行不应该在运行时抛出任何异常吗?

Era*_*ran 7

a1是一个A元素数组.由于B扩展A的所有实例B也的实例A,但不是所有情况下A都是实例B.您可以定义一个类C,该类也会扩展A并将该类的实例分配给该a1数组.这种情况不是实例B.

因此,您无法将A元素数组转换为B元素数组.