返回类型中的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不一样:“不要将通配符类型用作返回类型。”