有界通配符具有传染性,这就是您链接到的页面似乎在哀叹。好吧,无可否认……但是我想我并不认为这是一个大问题。
在很多情况下,正是 由于
有传染性,我才返回有界通配符。JDK的好坏(我说的更糟,但这是一个不同的肥皂盒:))没有只读集合的接口。如果我返回了一个
List<Foo>我不希望别人修改的代码(甚至可以安全地包装在中
Collections.unmodifiableList),则无法在返回签名中声明。作为穷人的解决方法,我经常回去
List<?extends Foo>。仍然可以尝试通过删除元素或插入来修改该列表
null,但是至少您不能
add(new Foo())提醒您该列表可能是只读的。
更笼统地说,如果您确实希望调用站点对对象的访问受到限制,则返回具有有限返回类型的东西是完全合理的。
另一个示例是线程安全队列,您将其移交给其他线程,其中一个线程是生产者,另一个线程是使用者。如果给生产者a
Queue<? superFoo>,很显然,您打算让他们将物品放入其中(而不是取出物品)。同样,如果给消费者一个
Queue<? extendsFoo>,很显然,您打算让他们取出物品(而不放入物品)。



