假设有 2 个类。 Child
扩展 Parent
。
public class Parent {}
和
public class Child extends Parent {}
我知道下面的代码是错误的:
Child obj = new Parent(); // causes java.lang.Error
或
Child obj = (Child) new Parent(); // causes java.lang.ClassCastException
但我不明白为什么在第一种情况下会出现编译错误,而在第二种情况下会出现运行时异常。毕竟,父项永远不能转换或转换为子项。 为什么第二种情况在编译时没有检查?
如果有一个清晰合理的想法,我将不胜感激!
最佳答案
Child obj = new Parent();
在这种情况下,编译器会尝试检查(隐式转换)Parent
对象是否可以设置为 Child
引用,当此转换失败时,您会收到编译时错误。
Child obj = (Child) new Parent();
在这种情况下,编译器会发现您正在显式地将 Parent
对象转换为 Child
,因此编译器将它留给运行时来决定转换是否有效,在感觉开发人员负责类型转换。因此,如果此转换失败,则会出现运行时错误。
关于java - 为什么在 Java 中类型与转换的不兼容性在运行时检查,类型不匹配在编译时转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16266559/