java编程思想中说到了向下强制类型转换,还有一个例子
import java.util.*; 
class Useful { 
  public void f() {} 
  public void g() {} 

class MoreUseful extends Useful { 
  public void f() {} 
  public void g() {} 
  public void u() {} 
  public void v() {} 
  public void w() {} 

public class RTTI { 
  public static void main(String[] args) { 
    Useful[] x = { 
      new Useful(), 
      new MoreUseful() 
    }; 
    x[0].f(); 
    x[1].g(); 
    // Compile-time: method not found in Useful: 
    //! x[1].u(); 
    ((MoreUseful)x[1]).u(); // Downcast/RTTI 
    ((MoreUseful)x[0]).u(); // Exception thrown 向下转换产生异常
  } 
} ///:~ 
这个例子中,向下类型转换中的语句产生异常,书上也没说怎么处理这个异常。
我想问下:java中是不是不允许使用向下类型转换(应该不是,因为书上还提到了RTTI),如果允许,那么怎么避免这种异常?

解决方案 »

  1.   

    实际类型是 new Useful(), 当然不能转换成MoreUseful类型了。
      

  2.   

    看楼主有点糊涂Useful u = new MoreUseful();这种不叫向下类型转换Useful u = new Useful();
    MoreUseful u1 = (MoreUseful)u;
    这种才叫向下类型转换第二种是不允许的,要抛运行时错误
      

  3.   


    Useful x[0] = new Useful();class MoreUseful extends Useful {}((MoreUseful)x[0]).u(); 你这不是向下类型转换。内存中的类型与编译时的类型都是 Useful 
    jvm 不知道向哪个方向转换类型。
      

  4.   

    要避免很简单,先判断他是不是那种类型的,是再转就可以了
    instanceof
      

  5.   

    这样向下转型是可以的
    Useful u = new MoreUseful();
    MoreUseful m = (MoreUseful)u;向下转型不报错的前提是,内存中的对象是子类对象
    比如上面的u虽然是一个父类的引用,但是内存中实际上是子类对象,所以就可以转
      

  6.   

    Useful u = new MoreUseful(); 这句话的意思是申明一个Useful的对象,指向一个MoreUseful的对象。因为子类的对象可以作为父类的对象。
      

  7.   

    “内存中的对象和编译时的对象都是Useful”从哪看出啊?
    是这条语句么?Useful x[0] = new Useful();
      

  8.   

    我们一旦申明了这个类型,他就是这个类型了,不会再变成别的类型了。不过我们可以用instanceof判断下,并可以引入一个新的对象进行转换。
      

  9.   

    new Useful()是内存中的对象(实例)。
    Useful x[0] 是申明的引用类型,x[0]是逻辑对象(指向内存中的实例)。
      

  10.   

    12楼学长,能具体指教一下小生吗,我刚刚接触java,想多知道些知识,谢了。