Java通配符与API中的Object相比有何区别?

3

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

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

从集合参数中读取项目,但从未更新。 我想将方法更改为:

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

这项更改是否能够保证对用户透明、安全并且没有任何副作用?

注:不确定这是否重要,但API还包含此方法:

public foo(Object object) { ... }
2个回答

3
将参数定义为Collection<?>,允许用户将任何他们想要的Collection传递给方法,因为Collection<?>实际上是所有类型集合的超级类型。
同时,Collection<Object>仅与Collection<Object>值兼容,而不与Collection<String>Collection<Integer>等兼容,这是两种方法之间的区别。
总之,应用此更改实际上会破坏方法最初的意图,即仅处理Object集合。 foo(Object object)方法只是foo(Collection<Object> object)方法的重载,没有其他作用。

谢谢!这就是我需要的答案。我提到foo(Object),因为用户在尝试传递Collection<String>等参数时无意中调用了该方法。 - stleary

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接