返回类型中的Java有界通配符
我在很多地方读过,包括在方法返回类型中使用有界通配符是个坏主意。然而,我找不到一个办法来避免它与我的类。我错过什么了吗 情况是这样的:返回类型中的Java有界通配符,java,generics,bounded-wildcard,Java,Generics,Bounded Wildcard,我在很多地方读过,包括在方法返回类型中使用有界通配符是个坏主意。然而,我找不到一个办法来避免它与我的类。我错过什么了吗 情况是这样的: class EnglishReaderOfPublications { private final Publication<? extends English> publication; EnglishReaderOfPublications(Publication<? extends English> publica
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;
}
}
class EnglishhreaderofPublications{
私有最终发布您可以在类声明中使用有界类型参数吗
class EnglishReaderOfPublications<E extends English> { ...
class EnglishhreaderofPublications{。。。
然后,您可以在任何有通配符参数的地方使用此类型参数。有界通配符是有传染性的,这就是您链接到的页面所哀叹的。嗯,不可否认……但我想我不认为这是一个大问题
在很多情况下,我返回有界通配符完全是因为它具有传染性。JDK无论好坏(我说的是更糟,但这是另一个soap框:)都没有只读集合的接口。如果我返回一个不希望人们修改的列表
(可能它甚至被安全地包装在集合中。不可修改列表
),在我的返回签名中无法声明这一点。作为穷人的解决办法,我经常返回列表“理想情况下,getPublication的调用方不希望结果是有界通配符。他们会对发布
感到满意。”
为什么他们“不会”想要它?他们会“快乐”吗使用publication基本上是因为污染。调用代码通过调用getPublication
来获取每个发布,并将其放入集合
。目前,我必须传递集合,该集合更难阅读,但更通用。我同意语法非常冗长。如果这些类/方法只是在你自己的代码中,如果你更喜欢的话,你可以选择易于阅读的方法。如果你正在编写一个你希望其他人阅读的API,正确使用通配符是非常重要的——因为如果有人有一个出版物,那将是一件很遗憾的事。我可以,但我不确定它对我的情况是否有帮助。我有一个不同的英文阅读器的集合我想从他们那里得到出版物,而我所关心的只是它们是Publication
。我想我的问题更多的是为什么Publication
与Joshua Bloch的《有效Java》中的PublicationItem 28不一样:“不要将通配符类型用作返回类型。”