Java在返回类型中绑定了通配符

我已经阅读过各种各样的地方,包括在方法返回类型中使用有界通配符是一个坏主意。 但是,我无法找到一种方法来避免与我的class级。 我错过了什么吗?

情况看起来像这样:

class EnglishReaderOfPublications { private final Publication publication; EnglishReaderOfPublications(Publication publication) { this.publication = publication; } void readPublication() { publication.omNomNom(); } Publication getPublication() { return publication; } } 

总而言之,我希望能够使用某些变体的英语版本的类。 该类需要允许从外部访问该发布,但理想情况下, getPublication的调用者不希望将结果作为有界通配符。 他们会对Publication感到满意。

这有什么办法吗?

有界通配符具有传染性,这就是你链接到的页面似乎感叹。 嗯,不可否认…但我想我不认为这是一个大问题。

在很多情况下我会返回一个有界通配符, 因为它具有传染性。 JDK,无论好坏(我说更糟糕,但这是一个不同的肥皂盒:))没有只读集合的​​接口。 如果我返回一个List ,我不想让人们修改(也许它甚至安全地包装在Collections.unmodifiableList ),那么就没有办法在我的返回签名中声明它。 作为一个穷人的解决方法,我会经常返回List List 。 仍然可以通过删除元素或插入null来尝试修改该列表,但至少无法add(new Foo())这一事实可以提醒您此列表可能是只读的。

更一般地说,如果您真的希望调用站点具有对该对象的受限访问权限,我认为返回具有有界返回类型的内容是完全合理的。

另一个例子是你交给不同线程的线程安全队列,其中一个线程是生产者而另一个是消费者。 如果你给生产者一个Queue Queue ,很明显,你打算将物品放入其中(而不是取出物品)。 同样,如果你给消费者一个Queue Queue ,很明显你打算把它们拿走(而不是放入物品)。

你能在类声明中使用有界类型参数吗?

 class EnglishReaderOfPublications { ... 

然后,您可以在具有通配符参数的任何位置使用此类型参数。

“理想情况下,getPublication的调用者不希望将结果作为有界通配符。他们会对Publication感到满意。”

为什么“不会”他们想要它? 他们会对Publication “感到高兴” Publication Publication ? 问题实际上是这些调用者需要对此Publication对象执行的操作。 如果他们所做的一切都是从中得到的东西,那么Publication Publication是足够的,它更好,因为它更通用。 但是,如果他们需要把东西放进去,那你就不能使用Publication Publication