当前位置:编程学习 > JAVA >>

从map 中取出来的键值对 值是对象,如何转化成具体的对象,key不确定

我一个Map map = new HashMap();

map.put("1",new Hello1());

map.put("2",new Hello2());

map.put("3",new Hello3());

Hello1 Hello2 Hello3 是一个Class ,

我存的时候是存进去的key 是类对象标识"1" “2” “3”,值 是对象,但是我取出的时候

Object o = map.get("?");  如果这个? 我不知道是1 ,2 ,还是 3

get得到的是Object 对象了, 而我想要得到一个具体的对象 怎么得到?

我要用这个具体对象的方法




--------------------编程问答-------------------- if (obj instanof Hello1)   转换为Hello1
if (obj instanof Hello2)   转为Hello2

if (obj instanof Hello3)   转为Hello3

这样应该可以。 --------------------编程问答-------------------- 就像楼上说的那样判断下

if (obj instanof Hello1){
  Hello1 1 = (Hello1) obj;
}
……
--------------------编程问答-------------------- 你的是一个办法,可是如果这个Map 里对象太多了 怎么办 我这个对象是从映射文件中解析的 要是有1000个对象也是正常的,, 还有 String  Hello1 这样的类名是什么类型呢 我可以把这个 Map 中的Key 定义成跟类名 一样的“Hello1” ,但是 是字符串类型  ,所以不能用Object o= map.get("Hello1"),得到一个o 我还知道"Hello1” ,不知道能用不能用得上 --------------------编程问答-------------------- 类里重写toString方法返回类名的字符串形式 --------------------编程问答--------------------
引用 3 楼 duanlexianer 的回复:
你的是一个办法,可是如果这个Map 里对象太多了 怎么办 我这个对象是从映射文件中解析的 要是有1000个对象也是正常的,, 还有 String  Hello1 这样的类名是什么类型呢 我可以把这个 Map 中的Key 定义成跟类名 一样的“Hello1” ,但是 是字符串类型  ,所以不能用Object o= map.get("Hello1"),得到一个o 我还知道"Hello1” ,不知道能用不能用得上

如果你真的需要把各不相同的东西放进一个map,那么请重写你的程序让它不要这样做,因为这必定是一个烂程序。所以没必要研究这个问题。真的碰到了,也只能用instanceof来做判断,但是最理想的状况是不需要判断,一个map里只放一种东西 --------------------编程问答-------------------- 你这个写起来是要干嘛的.

--------------------编程问答-------------------- 嗯我是在做一个容器 ,吧所有的mvc 的类 都实例化 放到容器里边 这个容器是Map,我用反射通过解读某个类的字节码 可以调用这个类的方法,
但是我想直接转换成具体的对象 就不用反射了 --------------------编程问答-------------------- 你可以建抽象类,作为你三个Hello的父类。如果实在没办法抽象,那我也不懂你为什么要把他们放一个Map里。 --------------------编程问答-------------------- 如果你的这些类都有共性,那么你可以用java多态的特性来实现

详见代码:
package com.test;

import java.util.HashMap;
import java.util.Map;

public class Test {
public static void main(String[] args) {
Map<String, Hello> map = new HashMap<String, Hello>();

map.put("1", new Hello1());

map.put("2", new Hello2());

map.put("3", new Hello3());

Hello hello = map.get("2");
hello.test();
}
}
class Hello1 implements Hello{
public void test(){
System.out.println("Hello1");
}
}
class Hello2 implements Hello{
public void test(){
System.out.println("Hello2");
}
}
class Hello3 implements Hello{
public void test(){
System.out.println("Hello3");
}
}

接口方法:
package com.test;

public interface Hello {
public void test();
}


因为所有的类都实现同一接口,所以程序直接Hello hello = map.get("2");写可以得到具体的实现类,然后调用方法实现每个类不同的操作。

如果你的类没有共性的话,我只能想到1楼说的方法,使用instanof。 --------------------编程问答--------------------
引用 7 楼 duanlexianer 的回复:
嗯我是在做一个容器 ,吧所有的mvc 的类 都实例化 放到容器里边 这个容器是Map,我用反射通过解读某个类的字节码 可以调用这个类的方法,
但是我想直接转换成具体的对象 就不用反射了

这样好像还是要通过反射去实例化对象。
反射相比使用instanof便于后期的维护,及减少了代码的冗余。 --------------------编程问答-------------------- 这个问题正确的解决方法应该是:
1、如果value中的对象是有一定的关系的,你定义一个借口。这些类都实现这个接口。
   放入map后,再取出使用的时候,不需要转变为以前的类对象,只需要用接口就可以。
  例:list系列
2、如果,你的对象没有关系,哪就改变你的key,添加的时候,将对象的名称加入到key中。
解析key。 --------------------编程问答-------------------- 我来支个招
interface IClassCaller {
  void callMethod(Object... params);
}

class TypeA {
  public void methodA (int param) {
    ...
  }
}

class TypeB {
  public void methodB (String param) {
    ...
  }
}

class Main {
  private HashMap<String, IClassCaller> iMap;

  public static void main(String[] args) {
    final TypeA a = new TypeA();
    final TypeB b = new TypeB();

    iMap.put("1", new IClassCaller {
      @Override
      public void callMethod(Object ... params) {
        a.methodA((Integer) params[0]);
      }
    });

     iMap.put("2", new IClassCaller {
      @Override
      public void callMethod(Object ... params) {
        a.methodB((String) params[0]);
      }
    });

    iMap.get("1").callMethod(5);
    iMap.get("2").callMethod(5);
  }
}

这个办法的唯一缺陷就是当你的方法带不同参数的时候用起来不方便,仍然是需要知道拿出来的对象是什么。如果不带参数就好使了 --------------------编程问答-------------------- 定义map的时候少打了static,自己纠正一下 --------------------编程问答-------------------- 写一个父类呗 --------------------编程问答-------------------- 有个getclass方法 --------------------编程问答-------------------- 你都是存的 Class 对象啊,虽然Class 代表的类不同.
这就与spring容器里的bean一样的.

应当这样: 
Class clazz = (Class)map.get("?");
Object oo = clazz.newInstance();
然后用反谢调用默认的构造方法,生成一个对象(不带参数,所有类都有样操作)
在spring里这个oo是谁用谁转换, 如果我get(2),我本来就知道2是何类,强制转换一下就行了. --------------------编程问答-------------------- 提示,容器本来就是用来保存各种对象,不需要知道是什么对象, 你只需要用反射生成一个类的实例给别人用就行.
想要使用的人用key来取对象就是,他既然知道了key自然就知道自己要什么,
而容器又不要使用,只是存放,所以不需要知道是什么对象. --------------------编程问答-------------------- 例子:
我要取一个Hello2 我知道要用key=2才能取到:
Class clazz = (Class)map.get("2");
Object oo = clazz.newInstance();
Hello2  hh = (Hello2 )oo;
这就完事了,得到了hello2类的实例对象了.
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,