首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java为什么不禁止从“低级”类转换为“高级”类?

Java为什么不禁止从“低级”类转换为“高级”类?
EN

Stack Overflow用户
提问于 2022-01-13 07:25:41
回答 1查看 79关注 0票数 -1

设A和B是和类,B扩展A,考虑

代码语言:javascript
复制
B b=(B)new A();

这显然会导致错误,因为A确实包含比B少的变量和方法,但是为什么Java不禁止它。因为例如,接口中的每个方法都必须始终被实现,因为如果它是不同的,它会在安装时给出一个错误,或者最后的抽象类是不可能的,因为它必须被扩展。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-13 09:44:46

让我们看看您的代码行:

代码语言:javascript
复制
B b=(B)new A();

使用

代码语言:javascript
复制
class B extends A { ... }

Java编译器的智能是有限的。对于我们人类来说,并不是所有显而易见的事情都是由编译器检测到的。

我们的人类推理是这样的:

  • new A()给出了类A的对象,而不是类A的对象,而不是子类。
  • (B)new A()我们想把它当作B的一个实例或它的一个(B)new A()的实例,我们知道它正是A类的一个实例,我们得出的结论是,转换到B是错误的。

F 216

我们推理的关键是短语“精确的类A",不包括任何A子类。

编译器根本就没有这样的推理,它从不排除子类。其理由是:

  • new A()给出了类A的对象,因此表达式类型是A,隐式地包含了所有A subclasses.
  • The Expression(B)new A(),希望将其视为B的实例或其子类之一。对于编译器来说,这是完全可能的,因为BA的一个子类,所以类型A的表达式确实可以是A类型--编译器允许这一行代码,尽管它肯定会在运行时抛出一个ClassCastException

关键是,编译器沿着表达式类型的概念,总是隐式地包含子类,并且对不可能子类的表达式没有特殊的处理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70692799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档