我有 2 个类 C1 和 C2(C2 继承自 C1)。我不能明确地将 C1 引导到 C2:
C2 l = (C2) new C1(5);
但它可能是这样的:
C2 c2 = new C2(5);
C1 c1 = c2;
C2 c21 =(C2) c1;
问题:当我们将c2 引用的值赋给类C1 的引用时,这是可以理解的,子类可以“缩小”到父类。但是,当我们将对类 C1 的引用转换为 C2 的引用分配给引用 c21 时,为什么这样的转换会起作用,因为在我们的例子中,c1 本质上是对父类的引用,它如何“扩展”到子类?
在第一种情况下,在运行时抛出,因为创建了父类的
ClassCastException实例,不能将其分配给子类,因为这样的实例不具有所需子类的功能。在第二种情况下,有一个真正创建的后代类实例
C2,因此从祖先到后代的“反向”类型转换C2 c21 = (C2) c1;将正常工作。