java – 编译时和运行时的Downcasting / Upcasting错误?

请检查以下程序.

我怀疑编译器何时会在编译器级别发出转换异常以及什么时候它将在运行时?

喜欢下面的程序,表达

我假设(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没什么区别.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...