请检查以下程序.
我怀疑编译器何时会在编译器级别发出转换异常以及什么时候它将在运行时?
喜欢下面的程序,表达
我假设(Redwood)新的Tree()应该在编译时失败,因为Tree不是Redwood.但它在编译时没有失败,正如预期的那样在运行时失败!
public class Redwood extends Tree { public static void main(String[] args) { new Redwood().go(); } void go() { go2(new Tree(),new Redwood()); go2((Redwood) new Tree(),new Redwood()); } void go2(Tree t1,Redwood r1) { Redwood r2 = (Redwood)t1; Tree t2 = (Tree)r1; } } class Tree { }
解决方法
编译器只会查看表达式的编译时类型.它不对表达式的运行时类型进行假设. new Tree()有编译时类型Tree,所以(Redwood)new Tree()与(Redwood)myTreeVariable没什么区别.