如果我运行时创建了一个类,不过创建的时候就已经把它向上转型为Object了。
不过后来我想把它向下转为它本来的类型,应该怎样做?最好可以说说使用Class对象的方法。
当然其他的方法也可以接受。不要问我为什么这样做。我只是想知道怎样可以运行时转型为本来的类型。谢谢!

解决方案 »

  1.   

    class B {
    void p(){
    System.out.print("this is b");
    }
    public static void main(String[] args){  
      B b=new B();
      Object o=(Object)b;  
      b=(B)o;
      b.p();
    }
    }
      

  2.   

    不知道你说的是这个意思不:
    Object obj = Class.forName("com.wssgwps.Test").newInstance();
    Test t = (Test)obj;
    t.doYourThing();
      

  3.   

    大家都误会我的意思了。大家给出的解析都是已经知道类型,然后转换的。我说的是不知道究竟属于那个类型。我想说的是,假如运行的时候我有一个对象A被一个Object引用了,当然我并不知道找个对象A的具体类型。但是如果我想把它转换成A本身的类型,怎样转换?大家的类型转换都是已知类型,然后具体转换的。但是我是不知道具体的类型,不能在编译的时候具体转换,所以要在运行时动态转换。
      

  4.   

    就好像我要创建一个List,但是这个list有一个要求:插入一个对象之后,那么以后就不能插入找个对象类型以外的其他类的对象。但是这个我可以通过Class类得到第一插入的对象的具体类型,然后通过isInstance来判断以后插入的是不是跟第一次插入的对象一个类型。但是如果我使用list里面的对象时,如果我想把他们都转换成原来的类型呢,找个就是握要知道的问题,该如何转换?注意我针对的jdk1.4,不要涉及5.0的泛型。
      

  5.   

    Date d=new Date();
    System.out.println(d.getClass().getName());//不知道是不是这个意思C:\ww>java test
    java.util.Date
      

  6.   

    不是楼上的意思,楼上的根本没有类型转换,而且d的类型本来就知道了,就是Date。我讨论的是运行时才创建一个对象。
      

  7.   

    程序当然不知道.
    所以你只能在运行时把一个类向上转换(up cast)成他的父类/父接口,调用父类的方法.这就是为什么要设计成继承体系的原因.
      

  8.   

    有一种不好的写法,你可以试试if( o instanceof Object ) {
        //do sth
    }
      

  9.   

    import java.util.*;
    public class test3 { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO 自动生成方法存根 ArrayList l=new ArrayList();

    String s="this is a String";

    l.add(s);

    Class c=l.get(0).getClass();

    String s1="this ia another String";
    Double d=new Double(10);
    if(s1.getClass() == c) {
    l.add(s1);
    }
    if(d.getClass() == c) {
    l.add(s1);
    }

    System.out.println(l);
    }}是不是这个意思啊?
      

  10.   

    To vintager4(泥巴) :你编写的程序是根据第一个放入的对象类型来确定以后只能放入同一种对象的方法吧?
    谢谢。
    这是一个前提,我想知道的是然后取出后然后转型。给一个例如:import java.lang.*;
    import java.util.*;public class staticCollection{
    private List li=new ArrayList();
    private boolean hasMenber =false;//是否已有第一对象的标志

    public void add(Object o){
    if(hasMenber){
    if((li.get(0).getClass().isInstance(o)))
    li.add(o);
    else System.out.println("you can't add this object!!"); 
                       }
                       else {li.add(o);
                         hasMenber=true;
                       }
    }
    public static void main(String[] args){
    staticCollection sc=new staticCollection();
    sc.add("String");
                      sc.add("String2");
             //sc.add(new Integer(1));//运行错误,
                                             //因为第一次放入对象已经决定了类型                  //问题来了,如果我现在想使用String的特有方法charAt()
                      //当然要先把它转型才可以用啊,想这样(String)加前缀直接转型
                      //但是需要考虑的是,你不知道放入的是String类呢?怎么办?
                      //如果到运行时才动态放入对象到StaticCollection中,那么我们
                      //有可以能不会知道他放入是什么类型的对象的,确实有这种可能。
                      //总不能通过instanceof来判断吧,可是有成千上万的类啊!!
                      //那么我现在想向下转型回原来的对象使用特有的方法,该怎么办?

    }希望大家继续支持~~
      

  11.   

    從樓主的程序來看
    應該無法add其他類的對象,我認為
    因為已經進行判斷了
    if((li.get(0).getClass().isInstance(o)))//判斷第一個對象的類是否和新增加的類一樣
    我的理解,對嗎?
    如果錯了,請指正
      

  12.   

    能否在你的对象中建立方法 a()
    方法A保存对象的类别 比如说用String
    然后在object中调用a()来获得对象类别 然后转换以上纯属猜想
      

  13.   

    比如说覆写toString()
    toString()返还对象类别
    然后object调用toString()来获得对象类别 转换 我试试看
      

  14.   

    insiku(㊣瀟湘夜雨㊣)写个程序来看看。得到类型倒是容易,只是我想知道如果转换成这个类型。总不能每个类型都判断,然后转换吧。
      

  15.   

    to cm4ever(单细胞生物,亩产三万斤) :请问你是那里明白了向下转换只能是强制而不能动态的?
    确实如你所说,我没有清楚的了解OO概念。因为我是一个程序的初学者。OO以后才找个时候专门学习。真的只能强制转换而不能动态吗?
    为什么呢?请大家发表一下意见,谢谢!
      

  16.   

    直接就用Class.forName("className").newInstance()得到一个Object 然后再得到这个Object的Class对象,就可以获取这个Class的方法和变量. 方法可以用Method.invoke(..)调用. 有了Classs就可以随心所欲.  看JDK文档获取更多信息