首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >返回类型中的Java边界通配符

返回类型中的Java边界通配符
EN

Stack Overflow用户
提问于 2012-01-23 10:01:35
回答 3查看 7.4K关注 0票数 18

我在很多地方都读到过,包括here,在方法返回类型中使用有界通配符不是一个好主意。然而,我找不到一种方法来避免它与我的类。我是不是遗漏了什么?

情况看起来像这样:

代码语言:javascript
复制
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>感到满意的。

有什么办法可以解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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>,很明显你想让他们把东西拿出来(而不是放进去)。

票数 14
EN

Stack Overflow用户

发布于 2012-01-23 10:05:42

可以在类声明中使用有界类型参数吗?

代码语言:javascript
复制
class EnglishReaderOfPublications<E extends English> { ...

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

票数 5
EN

Stack Overflow用户

发布于 2012-01-23 16:25:36

“理想情况下,getPublication的调用者不想要有界通配符形式的结果。他们会对Publication<English>感到满意。”

为什么他们“不”想要呢?他们会对Publication<? extends English>感到“满意”吗?问题是这些调用者需要对这个发布对象做什么。如果他们所做的就是从中获取东西,那么Publication<? extends English>就足够了,而且它更好,因为它更通用。但是,如果他们需要把东西放进去,那么你就不能使用Publication<? extends English>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8966502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档