【发布时间】: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<Map<Object, List<Object>>> theclass)不是一个有用的方法签名,因为它要求theClass是完全 表示Map<Object, List<Object>>的类,所以只有一个非-null可以传递给该方法的值。也许你想写public void doSomething(Class<? extends Map<Object, List<Object>>> theclass)(它也接受子类)?
标签: java class object reflection casting