在继承关系中子类向基类的类型转换可以是隐式的类型转换。例如:(假设Employee类继承于Person类,Monkey类是单独一个类)
Person p = new Employee();
如果Employee不是Person的子类,将发生编译时错误,编译器无法进行类型转换。
而基类向子类的类型转换则需要使用显式的类型转换。例如:
Person p = new Employee();
Employee e = (Employee)p;
如果p的编译时类型不是Employee的基类,将发生编译时错误,如果p的运行时类型不是Employee类或者Employee类的子类,将发生运行时错误。 例如:
Monkey m = new Monkey();
Employee e = (Employee)m; // 编译错误
Person p = new person();
Employee e = (Employee)p; // 运行错误
由于任何类都继承了Object类,因此编译角度来讲任何类都可以向上转型为Object类,再向下转型为另一个类。(假设Person和Monkey没有继承关系),例如:
Monkey m = new Monkey();
Object o = m;
Person p = (Person)o;
这种情况下编译没有问题,但是会发生运行时错误(因为Monkey不是Person类或其子类)。如果去掉Object的中间对象,代码可简写为:
Monkey m = new Monkey();
Person p = (Person)(Object)m;
其中对m向Object的强制类型转换不可或缺,否则将发生编译时错误(除非有Monkey到Person的自定义隐式类型转换),虽然这是一种隐式类型转换。