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 extends Foo>
List extends Foo>
。 仍然可以通过删除元素或插入null
来尝试修改该列表,但至少无法add(new Foo())
这一事实可以提醒您此列表可能是只读的。
更一般地说,如果您真的希望调用站点具有对该对象的受限访问权限,我认为返回具有有界返回类型的内容是完全合理的。
另一个例子是你交给不同线程的线程安全队列,其中一个线程是生产者而另一个是消费者。 如果你给生产者一个Queue super Foo>
Queue super Foo>
,很明显,你打算将物品放入其中(而不是取出物品)。 同样,如果你给消费者一个Queue extends Foo>
Queue extends Foo>
,很明显你打算把它们拿走(而不是放入物品)。
你能在类声明中使用有界类型参数吗?
class EnglishReaderOfPublications { ...
然后,您可以在具有通配符参数的任何位置使用此类型参数。
“理想情况下,getPublication的调用者不希望将结果作为有界通配符。他们会对Publication
感到满意。”
为什么“不会”他们想要它? 他们会对Publication extends English>
“感到高兴” Publication extends English>
Publication extends English>
? 问题实际上是这些调用者需要对此Publication对象执行的操作。 如果他们所做的一切都是从中得到的东西,那么Publication extends English>
Publication extends English>
是足够的,它更好,因为它更通用。 但是,如果他们需要把东西放进去,那你就不能使用Publication extends English>
Publication extends English>
。