我在维护的代码中遇到了这个类:
new GenericFutureListener<Future<? super Void>>() {...}
我很难理解这是什么意思。一个包含类型为Void
或其超类 - Object
的Future
。那么为什么不直接写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.如果您有一个FutureListener<Future<Object>>
,当未来完成时它可以处理任何Object
值;2.由于是Object
,它可以处理V
。因此,它可以监听Future<V>
。显然,对于任何V
的超类型而不是Object
,情况也是如此。
当然,如果Java有声明站点方差,这些签名将简单得多,但它没有,并且可能不会在短时间内实现。
Future
版本,可以用作消费者。 - Jorn Vernee看起来这是为了符合一些通用类型(例如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
不能仅传递GenericFutureListener<Future<Void>>
。
Future<? super Void>
只能是一个void future,或者是一个Object
future。开发人员的意图几乎肯定是限制"listeners"只能执行void操作。但是如果允许那么为什么不直接写Future呢?
Future<Object>
,那么任何其他类型都可以用作Future
的值,因为Future<Object>
可以保存一个String
(或任何其他类型)结果。java.lang.Void
是一个final
类,它不允许有任何子类,这实际上几乎完全限制了它只能执行void操作(除非在设置future的结果时调用new Object()
具有实际价值)。Void
是最终的,因此声明 ? super Void
而不是仅使用 Void
没有太多意义。 - Eugene? extends Void
是正确的,但是对于 super
不是。 - Florian AlbrechtFuture<? extends Void>
(尽管这几乎没有用)。我不认为允许 Future<Object>
作为具体的泛型类型参数有任何实际理由,我同意它应该被改成 Future<Void>
,但是谁知道,也许那个监听器类有一些非常罕见的用途。 - ernest_kFuture<Void>
来表示任务没有结果。Future<Object>
或Future<?>
并将null
作为结果。Future<Void>
和Future<Object>
。所以他使用Future<? super Void>
来适应这两种泛型。是的,您可以在该监听器中使用 Future<Object>
,但声明明确表明该监听器不应/不会使用结果。
将其声明为GenericFutureListener<Future<Object>>
会给人留下监听器会对结果进行操作的印象。
Future<Void>
.. 我没有点踩的意思。 - EugeneFuture<Object>
。 - kutschkem
Future<Void>
。 - user2357112java.util.concurrent.Future
)? - Jorn Vernee