API中的Java通配符与对象

时间:2015-04-14 17:18:50

标签: java generics

我有一个现有的Java API方法:

public foo(Collection<Object> collection) {... }

从集合param读取项目,但永远不会更新。我想将方法​​更改为:

public foo(Collection<?> collection) {... }

这种变化是否保证透明,安全,对用户没有副作用?

注意:不确定它是否重要,但API也包含此方法:

public foo(Object object) { ... }

2 个答案:

答案 0 :(得分:3)

将参数设置为Collection<?> 允许用户将他们想要的任何Collection传递给该方法,因为Collection<?>实际上是所有类型的超类型收藏品。

与此同时,Collection<Object>仅与Collection<Object>值兼容,但与Collection<String>Collection<Integer>等不兼容,这使得两种方法之间存在差异

总而言之,通过应用此更改,您实际上会破坏方法的初始意图,即仅使用Object的集合。

foo(Object object)方法只是foo(Collection<Object> object)方法的方法重载,仅此而已。

答案 1 :(得分:0)

它具有“副作用”,即无法在Collection<String>上调用原始方法,而第二种方法允许使用Collection<String>作为调用参数。