首页 > 解决方案 > 将一个类对象转换为另一种类型时编译时 ClassCastException 和错误之间的区别

问题描述

class A 
class B extends A
class C extends B
Line 1- C c = new B();   //CTE: Type mismatch: cannot convert from B to C
Line 2- B b = (B) a;     //A type is explicitly down casted to B type.
Line 3- C c = (C) b;    //Here, you will get class cast exception but why 
                          not CTE?

我的问题是为什么第 1 行会像第 3 行一样在运行时抛出 CTE 而不是 ClassCastException?幕后发生了什么以及编译器如何知道这是不正确的,它会为第 1 行抛出编译时错误,以及为什么编译无法理解第 3 行也抛出错误,它应该只在编译时抛出,而不是 ClassCastExcepion运行。

我希望我的问题很清楚,我在这里检查了很多问题,但似乎没有一个问题能回答我的问题,所以请在标记重复之前确保其他问题回答了我的问题。

标签: java

解决方案


class B extends A
class C extends B

Line 1- C c = new B()

就像:

Dog doggy = new Mammal();

这是行不通的。每个 C 都是 B,但不是每个 B 都是 C!

您的第三行“3-”(在概念上)是这样的:

Dog doggy = (Dog) new Mammal();

这也是荒谬的,但好吧,这就是演员表的事情。你告诉编译器“我比你更了解”。当你是对的,太好了。否则,您会在运行时被打耳光。

换句话说:强制转换是“覆盖”编译器的一种方式。没有它们,编译器会告诉您“这是不可能的”。正如演员所说:“编译器,相信我,这很好”。在你的情况下,它不是。


推荐阅读