例如,这两个方法签名之间有什么区别吗?
Something<?> doIt(Collection<?> collection)
和
Something<Object> doIt(Colllection<Object> collection)
是的,有。这适用于?
,但不适用于Object
:
List<Foo> fooList = new List<>()
doIt(fooList)
原因是即使Foo
是Object
,List<Foo>
也是而不是List<Object>
。为什么?假设我们有一个与Foo
无关的类Bar
,我们这样写doIt
:
void doIt(Collection<Object> collection) {
collection.add(new Bar())
}
现在,如果允许调用doIt(fooList)
,我们最终会得到包含Bar
的List<Foo>
!