<做什么?超级虚空>卑鄙?
我在维护的代码中遇到过这个类:
new GenericFutureListener<Future<? super Void>>() {...}
我真的很难理解这意味着什么。包含类型或其超类 - 的 。那么为什么不直接写呢?Future
Void
Object
Future<Object>
我在维护的代码中遇到过这个类:
new GenericFutureListener<Future<? super Void>>() {...}
我真的很难理解这意味着什么。包含类型或其超类 - 的 。那么为什么不直接写呢?Future
Void
Object
Future<Object>
没有人指出:这是Netty,如果你看一下 https://netty.io/4.0/api/io/netty/util/concurrent/class-use/Future.html 你会看到有一些方法在库中只采用这种类型,例如。由于一般情况,这些方法具有此签名:. 只是扩展 。ChannelPromise.addListener(GenericFutureListener<? extends Future<? super java.lang.Void>> listener)
Future.addListener(GenericFutureListener<? extends Future<? super V>> listener)
ChannelPromise
Future<Void>
通用情况有意义,因为 1.如果你有一个,它可以在将来完成时处理任何值;2.由于a是它可以处理的。因此,它可以侦听 .显然,对于任何超类型而不是 .FutureListener<Future<Object>>
Object
V
Object
V
Future<V>
V
Object
当然,如果Java具有声明站点差异,这些签名会简单得多,但它不会,而且可能不会很快出现。
看起来这是为了符合某些泛型类型而创建的,例如 ,它不够灵活,无法单独使用。GenericFutureListener<Future<? super T>>
GenericFutureListener<Future<Void>>
例如,如果你有这样的东西:
class GenericFutureListener<T> {}
public static <T> void m(GenericFutureListener<Future<? super T>> p) {
...
}
m(new GenericFutureListener<Future<? super Void>>() {}); // works,
m(new GenericFutureListener<Future<Void>>() {}); // does not work
不允许只通过 a。GenericFutureListener<Future<Void>>