新手求教泛型问题,为何泛型指定Object后依然无法接收其它指定泛型

Skyrime 2018-06-26 10:05:36
Info<String> i1 = new Info<String>();
Info<Object> i2= new Info<Object>();
i2 = i1;
这样编译无法通过,但我的感觉,这样编译的话,i2泛型擦除换成Object类,i1泛型擦除换成String类,然后i2 = i1的话,应该可以一一对应,原本所有泛型变量发生了类似Object i2 = String i1 的向上转型,然而这样编译是无法通过的,这跟泛型背后的机制有关吗


还有虽然用通配符就可以接收, 但是还是有无法设置的问题,这又是为什么?
Info<?> i = new Info<String>();
i.set("abc"); // 编译错误,已经指定为String了却还是无法传入String参数

望大神指教,多谢!
...全文
316 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
stacksoverflow 2018-06-27
  • 打赏
  • 举报
回复
每细研究,我理解泛型就是一个替换模板,既然是模板,就不存在Java的多态性。
所以问题1,一个是String,一个是Object,无法替换。
问题2,你没有规定具体类型,自然也就无法知道你要传入的时什么参数,因为new后面的东东是运行时决定的,
编译期间你能用点能操作的东东取决于等号左边的类型,比如说:
Info<?> i = new Info<String>();
i.set("abc"); //String类型
i = new Info<MyType>();
i.set(xxx); //其他类型类型
或者
Info<?> i = null;
i.set("abc"); //什么类型?

在没有明确左边的类型的时候,编译器有时无法确定你到底要做什么,所以报错。

官方的说法参考下面:
https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

verejava 2018-06-27
  • 打赏
  • 举报
回复
Java 的语法定义问题
Skyrime 2018-06-27
  • 打赏
  • 举报
回复
解决了,就是泛型的提出原本就是为了避免需要用Object类接收各种类型的情况,因为什么都传递的话会有数据类型转换的安全问题,而泛型可以在事先不知道变量类型的情况下在运行时指定一种类型,如果这时候又允许第一个问题那种操作的话,那等于又回到用Object接收全部类型的参数的情况,所以java不允许你在用泛型时还这么操作。
第二个问题是因为Info的泛型类型在Info<?> i = new Info<String>(); 之后并没有被指定,new 后面的语句只是开辟了一个内存空间,编译器真正做类型判断时是看等号左边,所以i依然等于Info<?> i 而不是Info<String> i, 所以这时候传入String参数到没有指定泛型类型的 i 的方法里会导致编译错误。

62,614

社区成员

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

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