我有一个Object对象,该对象原来所属的类型已经知道,但是类型是以字符串形式表达的。如何将这个Object转换为它原来所属的类型?例如,例如,我从容器中读出了一个对象,当然,该对象是Object类型的,根据getClass()方法,我可以知道,这个对象原来所属的类型(例如,它原来属于String类型),如何把这个object转换为它原来所属的类型(String类型)?

解决方案 »

  1.   

    以前的类型 mm=(以前的类型)Object;
      

  2.   

    String str = (String)Object;
    或String str = Object.toString();
      

  3.   

    怎么说呢,总的来说这个是没有办法自动完成类型的转换的
    你可能只能知道这个容器里总共只有可能有几种类型
    然后就
    swich(arrayList.getClass().getName().hashCode()){
          case "String".hashCode():
    ......
      

  4.   

    请大家注意,String类型只是举个例子,可能容器里还有许多其它类型,另外,以前的类型名是用字符串表示的,所以像这样:以前的类型 mm=(以前的类型)Object,好像不行。二楼和三楼的朋友的方法好像不可行。
    真的没有其它办法吗?
      

  5.   

    if("String".equals(你的字符串)) {
     (String)你的Object
    } esle if("其他类型".equals(你的字符串)) {
     (其他类型)你的Object}

      

  6.   

    To: Holinfox() 
    具体问题具体对待。你要说一下,你转换类型之后要执行什么操作?这样才能回答你的问题。
      

  7.   

    我现在在做的是一个包,这个提供这样一个功能:用户可以调用包中提供函数把他自己的对象(有可能是任何对象)先保存起来,然后,在需要的时候又把存入的对象读取出来。因为用户要存入的对象的类型是不确定的,因此我用容器来实现(如ArrayList),这样才能存储各种类型,但现在面临一个问题:用户把它的对象存入容器后,就失去了类型信息(都变成Object类型了),因此读出来以后就是一个Object对象,而不是用户存进去之前的对象,如何把这个Object转化为用户刚存入前的类型呢?
      

  8.   

    这个问题只能由用户自己转换。对象存入容器之后,并没有失去类型信息,其类型信息仍然在其内部保留着。因为你做的是一个通用类,你不可能知道用户到底会存入什么对象。并且你也不知道用户会用什么方法从中取得对象。除非使用参数作为输出:
    定义方法:
    class MyList extends ArrayList {
    ....
    public boolean get(index id, Object obj){
            ele = list.get(id)
            if ( ele instanceof obj.getClass()) {
                  obj = ele;
                  return true;
            } else {
                  return false;
            }
        }
    }
    然后,用户使用:
    String s;
    myList.get(1, s);
    但这么做,一是java不提倡,另外,你给的信息也不够多。所以,如果你只想给用户提供一个容器,到目前为止就足够了。
      

  9.   

    好像挺有用的;关注;if (obj istanceof String) {
       ....
    } else if (obj instanceof List) {
    ......
    }
      

  10.   

    to:UnAgain如果由用户来自己来转换的话,似乎也不容易,因为,如果容器中的对象比较多的话,用户也很难分清哪个是哪个,除非用户这样做:  if(userClass1.class.isInstance(o1)){
         userClass1 uc = (userClass1)o1
      }else {
      if(userClass2.class.isInstance(o2)){
         userClass2 uc = (userClass2)o2
      }  ...........  其中,userClass1,userClass2等是用户的类型 , o1 , o2是用户从容器中读出的对象。这样用户好像需要写上一堆的if...else...才可以,不方便使用,有没有其它的办法?
      

  11.   

    这是我能想到的最好的解决方案了。动态类型识别,数组传递对象
    import java.util.ArrayList;
    import java.lang.reflect.Array;public class TestDynamicCast_1 {
        static class MyList {
            ArrayList list;
            
            public MyList(ArrayList list) {
                this.list = list;
            }        
            public boolean get(int index, Object[] obj){
                Object e = list.get(index);
                Object ea = Array.newInstance(e.getClass(), 0);
                if (obj.getClass() == ea.getClass()) {
                    obj[0] = e;
                    return true;
                }
                return false;
            }
        }
        public static void main(String[] args) {
            ArrayList<Object> list = new ArrayList<Object>();
            list.add(Integer.valueOf(1));
            list.add("Hello");
            list.add(list);
            
            MyList ml = new MyList(list);        Integer[] i = new Integer[1];
            if (ml.get(0, i)) {
                System.out.println(i[0]);
            }        String[] s = new String[1];
            if (ml.get(1, s)) {
                System.out.println(s[0]);
            }        ArrayList[] lists = new ArrayList[1];
            if (ml.get(2, lists)) {
                System.out.println(lists[0]);
            }
        }
    }
      

  12.   

    如果方便的话我们在线聊吧,比较实时
    MSN: [email protected]
      

  13.   

    Class.isInstance(reference)
    reference instanceof Object
    reference.equals(reference)
      

  14.   

    get方法也可以这么写:
            public boolean get(int index, Object[] obj){
                Object e = list.get(index);
                if (obj[0].getClass() == e.getClass()) {
                // 或者 if (obj[0].getClass().isInstance(e)) {                obj[0] = e;
                    return true;
                }
                return false;
            }
    但是,这样就要求用户使用时必须初始化数组,象这样:
            Integer[] i = new Integer[1];
            i[0] = 0;
            ml.get(0, i)我没有办法从得到数组可容纳的元素的类型,好像是不可能的。所以创建一个空数组来作类型匹配检验:
            Object ea = Array.newInstance(e.getClass(), 0);
            if (obj.getClass() == ea.getClass()) {另外,到目前为止,通过参数传递对象地址只能使用数组,所以我用数组作参数,而不是象最早的帖子中,使用引用作参数。