java - 将一个类对象转换为另一种类型时编译时 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运行。
我希望我的问题很清楚,我在这里检查了很多问题,但似乎没有一个问题能回答我的问题,所以请在标记重复之前确保其他问题回答了我的问题。
解决方案
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();
这也是荒谬的,但好吧,这就是演员表的事情。你告诉编译器“我比你更了解”。当你是对的,太好了。否则,您会在运行时被打耳光。
换句话说:强制转换是“覆盖”编译器的一种方式。没有它们,编译器会告诉您“这是不可能的”。正如演员所说:“编译器,相信我,这很好”。在你的情况下,它不是。
推荐阅读
- react-native - 自定义事件以检查反应原生 mapbox gl 地图中是否缺少样式图像
- flutter - 平台特定代码错误:MissingPluginException
- android - 从最小化应用程序列表中删除应用程序时如何保持服务运行?
- c# - ASP.NET Core Hangfire 生产部署
- javascript - 如何在 TS 中运行命令?
- excel - Excel VBA:WorksheetChange,每当单元格更改时,它都会编辑一个 CSV 文件
- javascript - 如何使用javascript单击chrome中的按钮
- r - 如何使用 R 根据组内列中的字符串拆分数据框?
- c# - 使用 C# 运行 PyInstaller exe 文件
- r - 查找分配创建的所有变量 - 不适用于pairlist