the*_*use 16 java generics bounded-wildcard
我已经阅读过各种各样的地方,包括在方法返回类型中使用有界通配符是一个坏主意.但是,我无法找到一种方法来避免与我的班级.我错过了什么吗?
情况看起来像这样:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
总之,我希望能够使用某些版本的英语版本的类.该类需要允许从外部访问该发布,但理想情况下,调用者getPublication不希望将结果作为有界通配符.他们会很高兴Publication<English>.
这有什么方法吗?
ysh*_*vit 13
有界的通配符具有传染性,这就是你链接到的页面似乎感叹.嗯,不可否认...但我想我不认为这是一个大问题.
在很多情况下我会返回一个有界的通配符,因为它具有传染性.JDK,无论好坏(我说更糟糕,但这是一个不同的肥皂盒:))没有只读集合的接口.如果我返回一个List<Foo>我不希望人们修改的东西(也许它甚至安全地被包裹Collections.unmodifiableList),那么在我的返回签名中没有办法声明它.作为一个穷人的解决方法,我经常会回来List<? extends Foo>.仍然可以通过删除元素或插入来尝试修改该列表null,但至少可以add(new Foo())提醒您这个列表可能是只读的.
更一般地说,如果您真的希望调用站点具有对该对象的受限访问权限,我认为返回具有有界返回类型的内容是完全合理的.
另一个例子是你交给不同线程的线程安全队列,其中一个线程是生产者而另一个是消费者.如果你给生产者一个Queue<? super Foo>,很明显你打算把它们放进去(而不是拿出物品).同样,如果您给消费者一个Queue<? extends Foo>,那么很明显您打算将物品拿出(而不是放入物品).
您可以在类声明中使用有界类型参数吗?
class EnglishReaderOfPublications<E extends English> { ...
Run Code Online (Sandbox Code Playgroud)
然后,您可以在具有通配符参数的任何地方使用此类型参数。