我在很多地方都读到过,包括here,在方法返回类型中使用有界通配符不是一个好主意。然而,我找不到一种方法来避免它与我的类。我是不是遗漏了什么?
情况看起来像这样:
class EnglishReaderOfPublications {
private final Publication<? extends English> publication;
EnglishReaderOfPublications(Publication<? extends English> publication) {
this.publication = publication;
}
void readPublication() {
publication.omNomNom();
}
Publication<? extends English> getPublication() {
return publication;
}
}
总之,我希望这个类能够使用任何与英语不同的出版物。该类需要允许从外部访问发布,但理想情况下,getPublication
的调用者不希望将结果作为有界通配符。他们会对Publication<English>
感到满意的。
有什么办法可以解决这个问题吗?
发布于 2012-01-23 12:42:12
有界通配符是有感染力的,这是您所链接的页面似乎在感叹的。好吧,不可否认的是...但我想我不认为这是一个大问题。
在很多情况下,我返回有界通配符正是因为它具有传染性。JDK,不管是好是坏(我说是好是坏,但这是一个不同的soap盒子:)没有用于只读集合的接口。如果我返回一个不想让人修改的List<Foo>
(也许它甚至被安全地包装在Collections.unmodifiableList
中),就没有办法在我的返回签名中声明它。作为穷人的变通方法,我经常返回List<? extends Foo>
。仍然可以尝试通过删除元素或插入null
来修改该列表,但至少不能使用add(new Foo())
这一事实提醒我们,该列表可能是只读的。
更广泛地说,如果您真的希望调用站点限制对对象的访问,我认为使用有界返回类型返回某些内容是完全合理的。
另一个示例是线程安全队列,您将其传递给不同的线程,其中一个线程是生产者,另一个线程是消费者。如果你给生产者一个Queue<? super Foo>
,很明显你打算让他们把东西放进去(而不是把东西拿出来)。同样,如果你给消费者一个Queue<? extends Foo>
,很明显你想让他们把东西拿出来(而不是放进去)。
发布于 2012-01-23 10:05:42
可以在类声明中使用有界类型参数吗?
class EnglishReaderOfPublications<E extends English> { ...
然后,您可以在具有通配符参数的任何地方使用此类型参数。
发布于 2012-01-23 16:25:36
“理想情况下,getPublication的调用者不想要有界通配符形式的结果。他们会对Publication<English>
感到满意。”
为什么他们“不”想要呢?他们会对Publication<? extends English>
感到“满意”吗?问题是这些调用者需要对这个发布对象做什么。如果他们所做的就是从中获取东西,那么Publication<? extends English>
就足够了,而且它更好,因为它更通用。但是,如果他们需要把东西放进去,那么你就不能使用Publication<? extends English>
。
https://stackoverflow.com/questions/8966502
复制相似问题