Java - 如何创建类<map <object,list <object>&gt;&gt;对象</地图<对象,列出的<object>

时间:2012-09-24 12:02:45

标签: java class object reflection casting

如果这是一个菜鸟问题,我很抱歉。我有一个方法,它采用具有泛型类型的Class对象作为参数。我能够做到以下几点:

Class cs = Map.class;

但是当我传递这个时,我得到一个“NoSuchMethodException”,因为声明了该方法:

public void doSomething(Class<Map<Object, List<Object>>> theclass){
...     
}

我试图像这样投射:

Class cs = (Class<Map<Object, List<Object>>>)(Class<?>)Map.class;

但我仍然得到同样的例外。

有办法做到这一点吗?

我无法在此发布完整代码,但我重现了错误: 该应用程序实际上使用反射。我不能在这里发布原始代码,但我已经复制了例外:

import java.lang.reflect.Method;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Class c = null;
        try {
            c = Class.forName("Second");
        } catch (ClassNotFoundException e1) {
            e1.printStackTrace();
        }
        String m = "doSomething";
        Method method = null;
        Class cs = Map.class;
        try{
            method = c.getMethod(m, cs);
        } catch (NoSuchMethodException e){
            e.printStackTrace();
        }
    }
}

class Second{
    public static void doSomething(Class<Map<Object, List<Object>>> theclass){
        System.out.println("HERE I AM!");   
    }   
}

例外:

java.lang.NoSuchMethodException: Second.doSomething(java.util.Map)
    at java.lang.Class.throwNoSuchMethodException(Class.java:283)
    at java.lang.Class.getMethod(Class.java:825)
    at Main.main(Main.java:16)

2 个答案:

答案 0 :(得分:1)

如果您正在进行此类演员,我认为您正在与旨在帮助您的类型系统作斗争。首先,

Class cs = Map.class;

原始类型(有关详细信息,请参阅here)。您是否尝试过实例化所需Map类的类,并将 类传递给您的函数?

e.g。

(new HashMap<Object, List<Object>>()).getClass();

注意:如上面评论中所述, ruakh ,您必须传递Map接口的实例,因此上面的方法声明将禁止此操作。基本上这里有一个基本的API设计问题!

答案 1 :(得分:1)

知道了!我更改了以下内容:

method = c.getMethod(m, cs);

为:

method = c.getMethod(m, cs.getClass());

现在有效!