interface I{}
class A implements I{}
class B{}
第一:
I[] arr = new A[10];
arr[0] = (I) new B(); // will produce ClassCastException at runtime
第二: 其中,如果我使用具体类
I[] arr = new A[10];
arr[0] = (A) new B(); // will produce compile-time error
如果在我的第一个示例中,(I) new B()
,java 编译器也应该产生编译错误,有什么区别?
不是说java编译器应该能够区分它也是“不可转换类型”吗?尤其是当 new 运算符立即出现时?
是否有任何实例/机会表明创建 B 的新实例可能会产生 I型的敞篷车?
我知道在某些时候,Java 编译器不应该立即说这是编译器错误,就像当你这样做时:
I i = (I) getContent(); // wherein getContent() will return a type of Object
编辑:
让我澄清这个问题,为什么它不可能与此重复:Cast reference of known type to an interface outside of type's hierarchy
这个问题的目的不是因为我不知道会导致什么结果或有什么问题等等。
我只是想知道“以技术方式更详细的解释”为什么 JVM 会这样,或者为什么 Java 会做出不让这种场景编译的决定-时间 错误。
众所周知,在编译时而不是在运行时查找“有问题的代码”总是更好。
另一件事,我正在寻找的答案是在这个线程上找到的,而不是在那些“重复?”上。
最佳答案
关于什么强制转换在编译时合法的规则只考虑静态类型。
当Java编译器分析表达式(I) new B()
时,发现表达式new B()
的静态类型是B
。我们可以判断出 new B()
不可能是 I
的实例,但编译时分析规则无法判断该对象实际上不是B
子类的一个实例,它实现了 I
。
因此,编译器必须让它通过。根据编译器的复杂程度,它可能会检测到异常并发出某种警告,但同样 1/0
不是编译时错误,这不可能是编译时错误。
关于java - 类型转换 "with"接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24158650/