【问题标题】:Java - How to create a Class<Map<Object,List<Object>>> objectJava - 如何创建一个 Class<Map<Object,List<Object>>> 对象
【发布时间】:2012-09-24 12:02:44
【问题描述】:

如果这是一个菜鸟问题,我很抱歉。我有一个方法,它接受一个具有泛型类型的 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)

【问题讨论】:

  • 您正在尝试与类型擦除作斗争。
  • 什么语句抛出异常?
  • 请向我们展示导致异常抛出的代码。简单地将错误的Class 对象作为方法参数传递不会导致它发生。你一定在做别的事情。
  • 请注意public void doSomething(Class&lt;Map&lt;Object, List&lt;Object&gt;&gt;&gt; theclass) 不是一个有用的方法签名,因为它要求theClass完全 表示Map&lt;Object, List&lt;Object&gt;&gt; 的类,所以只有一个非- null 可以传递给该方法的值。也许你想写public void doSomething(Class&lt;? extends Map&lt;Object, List&lt;Object&gt;&gt;&gt; theclass)(它也接受子类)?

标签: java class object reflection casting


【解决方案1】:

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

Class cs = Map.class;

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

例如

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

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

【讨论】:

  • 但该方法,如所列,由于不变性,不会接受这样的论点。 (见我上面的评论。)
【解决方案2】:

知道了!我更改了以下行:

method = c.getMethod(m, cs);

到:

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

现在可以了!

【讨论】:

  • cs.getClass() 最好写成Class.class
  • @TomHawtin-tackline 仅当 cs 是类文字时,否则 getClass 完全没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2018-09-22
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多