我正在使用Eclipse来帮助我清理一些代码以正确使用Java泛型.大多数情况下,它在推断类型方面做得非常出色,但在某些情况下,推断类型必须尽可能通用:对象.但Eclipse似乎给了我一种选择在一种Object和一种'?'之间的选择.
那么有什么区别:
HashMaphash1;
和
HashMaphash2;
Johannes Wei.. 135
HashMap
匹配的实例Map
但不是Map
.假设你想编写一个接受从String
s到任何东西的地图的方法:如果你愿意的话
public void foobar(Mapms) { ... }
你不能提供HashMap
.如果你写
public void foobar(Mapms) { ... }
有用!
在Java的泛型中有时会被误解的一点是,List
它不是一个子类型List
.(但String[]
实际上是一个子类型Object[]
,这是泛型和数组混合不好的原因之一.(Java中的数组是协变的,泛型不是,它们是不变的)).
示例:如果您想编写一个接受法List
第InputStream
S和亚型InputStream
,你会写
public void foobar(List extends InputStream> ms) { ... }
顺便说一下:当你想要理解Java中不那么简单的东西时,Joshua Bloch的Effective Java是一个很好的资源.(上面的问题在本书中也很清楚.)
HashMap
匹配的实例Map
但不是Map
.假设你想编写一个接受从String
s到任何东西的地图的方法:如果你愿意的话
public void foobar(Mapms) { ... }
你不能提供HashMap
.如果你写
public void foobar(Mapms) { ... }
有用!
在Java的泛型中有时会被误解的一点是,List
它不是一个子类型List
.(但String[]
实际上是一个子类型Object[]
,这是泛型和数组混合不好的原因之一.(Java中的数组是协变的,泛型不是,它们是不变的)).
示例:如果您想编写一个接受法List
第InputStream
S和亚型InputStream
,你会写
public void foobar(List extends InputStream> ms) { ... }
顺便说一下:当你想要理解Java中不那么简单的东西时,Joshua Bloch的Effective Java是一个很好的资源.(上面的问题在本书中也很清楚.)
另一种思考这个问题的方法是
HashMaphash1;
相当于
HashMaphash1;
将这些知识与Java Generics and Collections的第(2.4)节中的"获取和放置原则"结合起来:
获取和放置原则:当您只从结构中获取值时使用扩展通配符,当您仅将值放入结构时使用超级通配符,并且当您同时获取和放置时不使用通配符.
希望,外卡可能会开始变得更有意义.
如果你记得它Collection
只是一个包含类型对象的泛型集合Object
,但它Collection>
是所有类型集合的超类型,这很容易理解.