为什么在Java中,在运行时检查类型与转换的不兼容性,在编译时检查类型与转换的不匹配?
假设有两个类。而为什么在Java中,在运行时检查类型与转换的不兼容性,在编译时检查类型与转换的不匹配?,java,compiler-errors,runtimeexception,Java,Compiler Errors,Runtimeexception,假设有两个类。而Child扩展了Parent public class Parent {} 及 我知道以下代码不正确: Child obj = new Parent(); // causes java.lang.Error 或 但我不明白为什么在第一种情况下会出现编译错误,在第二种情况下会出现运行时异常。毕竟,父对象永远不能转换或强制转换为子对象为什么在编译时不检查第二种情况? 如果有一个清晰合理的想法,我将不胜感激 在第二种情况下,使用显式强制转换。这意味着基本上你是在告诉编译器你知道将会
Child
扩展了Parent
public class Parent {}
及
我知道以下代码不正确:
Child obj = new Parent(); // causes java.lang.Error
或
但我不明白为什么在第一种情况下会出现编译错误,在第二种情况下会出现运行时异常。毕竟,父对象永远不能转换或强制转换为子对象为什么在编译时不检查第二种情况?
如果有一个清晰合理的想法,我将不胜感激 在第二种情况下,使用显式强制转换。这意味着基本上你是在告诉编译器你知道将会发生什么。这是一种告诉编译器类型是什么的方法,所以他相信你 然而,运行库必须完成这项工作。。。他不能,所以他才是那个应该抱怨的人 (他/她?) 在这种情况下,编译器尝试检查(隐式转换)是否可以将
Parent
对象设置为Child
引用,当转换失败时,您会得到编译时错误
Child obj = (Child) new Parent();
在这种情况下,编译器看到您显式地将
Parent
对象强制转换为Child
,因此编译器将其留给运行时来决定强制转换是否有效,从某种意义上说,开发人员承担强制转换的责任。因此,如果此转换失败,您将得到一个运行时错误。原因是编译器需要额外的工作才能检测到这种情况,并且无法在所有情况下都正确执行。有时,但并非所有时候,让这成为编译器错误是不值得的
Child obj = (Child) new Parent();
虽然父实例永远不能是子实例,但对父实例的引用实际上可能指向子实例。通常,如果将类型为Parent的表达式强制转换为Child,则可能会成功。要确定它不能,编译器必须知道有关父类型表达式的额外信息。在本例中,它是一个构造函数调用。这是最简单的情况,也是唯一一种明显的情况,即父类型的表达式不能引用子类型的实例。为了获得这么小的好处,向编译器添加额外的复杂性是不值得的
子对象=新父对象();//导致java.lang.Error
不,没有。它会导致编译错误。一点也不一样。不要把不同的事物等同起来,从而混淆自己
编译器尽可能多地进行检查,其余部分留给运行时处理。在这种情况下,对Child的赋值显然是不正确的,并且可以在编译时检测到。另一种情况在编译时无法检测到。但是为什么在第二种情况下出现强制转换异常。它似乎很好。我试过了,对我来说效果很好。
Child obj = new Parent();
Child obj = (Child) new Parent();