1 //: Transmogrify.java 2 package cn.skyfffire; 3 4 /** 5 * @user: skyfffire 6 * @data: 2017年3月7日 7 * @time: 下午7:58:23 8 */ 9 interface Actor { 10 void act(); 11 } 12 13 class HappyActor implements Actor { 14 @Override 15 public void act() { 16 System.out.println("HappyActor."); 17 } 18 } 19 20 class SadActor implements Actor { 21 @Override 22 public void act() { 23 System.out.println("SadActor"); 24 } 25 } 26 27 class Stage { 28 Actor actor = new HappyActor(); 29 30 void change() { 31 actor = new SadActor(); 32 } 33 34 void go() { 35 actor.act(); 36 } 37 } 38 39 public class Transmogrify { 40 public static void main(String[] args) { 41 Stage stage = new Stage(); 42 43 stage.go(); 44 stage.change(); 45 stage.go(); 46 } 47 } 48 49 ///:~
可以发现:当两个类完全继承(即没有拓展接口与成员)基础类时,可以很方便地使用上溯造型进行灵活的句柄移动,但如果子类没有进行完全继承呢?
请参考下面的例子
1 //: RTTI.java 2 package cn.skyfffire; 3 4 /** 5 * @user: skyfffire 6 * @data: 2017年3月7日 7 * @time: 下午8:16:12 8 */ 9 class Useful { 10 public void f() {} 11 public void g() {} 12 } 13 14 class MoreUseful extends Useful { 15 @Override 16 public void f() {} 17 @Override 18 public void g() {} 19 20 public void u() {} 21 public void v() {} 22 public void w() {} 23 } 24 25 public class RTTI { 26 public static void main(String[] args) { 27 Useful[] x = {new Useful(), 28 new MoreUseful()}; 29 30 x[0].f(); 31 x[1].g(); 32 33 ((MoreUseful)x[1]).u();// 下溯造型成功,没有违例 34 // ((MoreUseful)x[0]).u();此时就抛出一个违例 35 } 36 } 37 38 ///:~
所以在进行下溯造型的时候一定要确保方法存在。