Class的泛型问题

visulcer 2014-02-07 11:09:08
例如:现在我有一个类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); // 这里就是问题了

不知道有没有人看懂我的意思,当然,如果不用泛型的话就没有这么多“尘埃”了
...全文
168 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
visulcer 2014-02-07
  • 打赏
  • 举报
回复
可能有人会说这样解决 map.put("xxx", (Class<? extends Action>) c); 但问题是“(Class<? extends Action>) c”,强制转换,这不是又回到了非泛型的路了?
lcf 2014-02-07
  • 打赏
  • 举报
回复
这里必须做一次显示转换 if (c instance of Class<Abc>) { Class<? extends Abc> abcC = (Class<? extends Abc>) c; mapping.put("xxx", abcC); }
suciver 2014-02-07
  • 打赏
  • 举报
回复
引用 5 楼 visulcer 的回复:

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);
	}
}
visulcer 2014-02-07
  • 打赏
  • 举报
回复

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有编译错误的,怎么样调整好,不要用强制转换
wanding_ 2014-02-07
  • 打赏
  • 举报
回复
public class TestG<T extends Abc> { Map<String,T> map = new HashMap<String,T>(); 这样不就可以了
oh_Maxy 2014-02-07
  • 打赏
  • 举报
回复
<? extends Abc>> 表示一个泛型,这个泛型为Abc的子类或者为其本身(Abc)类型。
  • 打赏
  • 举报
回复
没看懂啥意思。

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧