设A和B是和类,B扩展A,考虑
B b=(B)new A();这显然会导致错误,因为A确实包含比B少的变量和方法,但是为什么Java不禁止它。因为例如,接口中的每个方法都必须始终被实现,因为如果它是不同的,它会在安装时给出一个错误,或者最后的抽象类是不可能的,因为它必须被扩展。
发布于 2022-01-13 09:44:46
让我们看看您的代码行:
B b=(B)new A();使用
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.(B)new A(),希望将其视为B的实例或其子类之一。对于编译器来说,这是完全可能的,因为B是A的一个子类,所以类型A的表达式确实可以是A类型--编译器允许这一行代码,尽管它肯定会在运行时抛出一个ClassCastException。关键是,编译器沿着表达式类型的概念,总是隐式地包含子类,并且对不可能子类的表达式没有特殊的处理。
https://stackoverflow.com/questions/70692799
复制相似问题