JAVA泛型中通配符到底是什么东西
比如有这样一个泛型类
public class Gen<T>{
}
然后在其他类中有这样一个方法
public void showKeyValue(Gen gen){}
public void showKeyValue(Gen<?> gen){}
还有,为什么Gen<Object>和Gen<String>是同一种类(Gen<Object>.Class = Gen<String>.class)
但是Gen<String>却不能指向Gen<Object>的引用(Gen<Object> gen = new Gen<String>会报错)
这两种方法有什么区别吗,如果没有,那么这个的意义在哪呢?
新手,希望能有大神解释下
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
官方文档 中有写这个问题. 这里做一把搬运工, 大致翻译如下:
无界通配符(unbounded wildcard)在以下两种场景下使用:
Object
类中的方法, 比如toString()
.Class<?>
:Class<T>
类中的多数方法都不需要知道T
的类型.关于第一种情况的例子, 有如下方法, 用来打印
List
中的元素信息:但上面的函数输出的是一串内存地址, 而不是
toString()
方法的内容: 它无法正确打印List<Integer>
,List<String>
等列表的值, 因为这些列表并非List<Object>
的子类型. 使用List<?>
可以解决这个问题:因为
List<A>
是List<?>
的子类型, 所以上面函数可以正常打印任何类型的列表:注意:
List<Object>
和List<?>
也有区别: 前者可插入任何Object
子类, 后者只能插入null
, 原因见 官方文档中的通配符使用指南.刚刚看到你还有第二个问题.
Gen<Object> gen = new Gen<String>
会报错, 这个问题很好理解:gen.add(new Object())
这种操作是非法的, 因为新添加的Object
实例未必是String
实例.