日期:2014-05-20  浏览次数:20868 次

Class的泛型问题
例如:现在我有一个类Abc
有一个Map,Map<String, Class<? extends Abc>> mapping = new HashMap<String, Class<? extends Abc>>();

Class<?> c = Class.forName(className);

如果className这个类是继承了Abc的,那就会执行下面的代码
mapping.put("xxx", c); // 这里就是问题了

不知道有没有人看懂我的意思,当然,如果不用泛型的话就没有这么多“尘埃”了
------解决方案--------------------
引用:

package test;

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

public class Test {

public static void main(String[] args) throws ClassNotFoundException {

Map<String, Class<Test>> mapping = new HashMap<String, Class<Test>>();

String className = "xxx.xxx.xxx"; // 这里具体是什么并不重要

Class<?> c = Class.forName(className);

mapping.put("a", c);
}
}

最后mapping.put有编译错误的,怎么样调整好,不要用强制转换

由于泛型的编译期检查,如果不进行强制转换用平常的这样的写法是无法通过编译的。我们可以利用java泛型的只在编译期做检查的特点只要我们让编译器无法检查就行了,这种时候不用强转使用反射来调用put是最好的。

package test;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class Test {

public static void main(String[] args) throws ClassNotFoundException {

Map<String, Class<Test>> mapping = new HashMap<String, Class<Test>>();

String className = "xxx.xxx.xxx"; // 这里具体是什么并不重要

Class<?> c = Class.forName(className);

Method method=Map.class.getMethod("put",Object.class,Object.class);
                method.invoke(mapping,"a",c);
                System.out.println(mapping);
}
}