Java 泛型问题 坐等大牛

z282762779 2015-06-17 06:11:03


public class test<T> {

private final Map<Class<?>, Class<?>> map1 = new HashMap();
private final Map<?, ?> map2 = new HashMap();

public void put(Class<T> clazz, T t){
map1.put(clazz, clazz);//可以编译成功
map2.put(t, t); //编译失败
}
}


哪位能帮解释一下为什么这两者不一样,?通配符表示不确定的T那上面的问什么可以通过编译,Class<String> 和 Class<Integer>完全不一样啊
...全文
90 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
z282762779 2015-06-18
  • 打赏
  • 举报
回复
你说的我明白了,还有个问题能问一下吗?

private final Map<String, String> map1 = new HashMap();
private final Map<String, String> map2 = new HashMap<String,String>();

private final Map map3 = new HashMap();
private final Map<Object, Object> map4 = new HashMap();
map1和map2 有什么区别? map3和map4有什么区别?
Elastic慕容 2015-06-17
  • 打赏
  • 举报
回复
这个是考察对无界通配符的理解。首先要理解classname<?>并不是表示classname泛型中的任何一个,而是表示classname泛型的确定的一个。也就是说classname<?>一定是一个classname类型的泛型,但是不确定到底是classname<Apple>还是classname<Orange>.因此在你向其中添加元素时,如果添加的是Orange,那么系统就会想如何这个泛型万一是classname<Apple>呢,所以编译器类型检测不允许该语句通过,同样添加Apple也不可以。所以这样的泛型是无法添加元素的。所以Map<?, ?> map2是无法添加元素的,无论什么类型都不行。参考java编程思想p396页。 但是对于 Map<Class<?>, Class<?>> map1情况就不一样了,通配符是针对泛型Class来说的元素的。但是map1的参数是两个泛型类型的对象而不是?,此时静态类型检查只检查参数是不是Class类型,只要是Class类型的,不管是Class<Apple>,还是Class<Orange>都可以。 说白了map1要添加的是泛型Class<?>,对于泛型作为参数的方法,编译器只检查参数是否为该泛型,如果是该格式则允许添加。而map2要添加的是无界通配符?,对于无界通配符的容器是无法添加元素的,原因就是前面所说的Apple和Orange的原因。

50,535

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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