2

在 Java 5 中,ExecutorService接口声明了方法:

<T> List<Future<T>> invokeAll(Collection<Callable<T>> tasks)
    throws InterruptedException;

而用 Java 6 编写但据称与 Java 5 兼容的 Guava 11.0.2 将其覆盖ListeningExecutorService为:

 <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
     throws InterruptedException;

如果我想实现我自己的ListeningExecutorService,我需要实现这两种方法,但我也不能有两种方法相同的擦除,所以它有点像 Catch 22。

有没有办法解决这个问题?更具体地说,有没有办法ListeningExecutorService在 Java 5 中实现 a?

作为任何番石榴人的旁注——番石榴是否真的有必要重新声明这种方法,因为它已经继承自ExecutorService

4

3 回答 3

4

原始方法签名已报告为错误并已针对 JDK 6 进行了修复: http ://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6267833

引用解决消息:

  • 是二进制兼容的。
  • 与 ExecutorService的用户源兼容
  • 对于已经实现 ExecutorService 而没有继承 AbstractExecutorService 中的默认实现的一小部分开发人员,需要对源代码进行少量更改。受影响的开发人员是创建复杂线程池应用程序的开发人员,将他们归入“并发火箭科学家”类别。他们通常会欣赏这种变化。在源代码中修复可能的编译器错误是微不足道的。
于 2012-04-19T22:14:58.473 回答
3

我能想到实现这两个接口的唯一方法,虽然很可怕,是

List invokeAll(Collection tasks)

放弃泛型类型,记录你这样做的原因,并非常小心。

于 2012-04-19T22:16:06.973 回答
2

我们完成这项工作的方式是在我们的引导类路径中覆盖 JDK 的 ExecutorService 接口。您可以在项目编译期间执行类似的操作。查看我们的设置的最简单方法可能是在版本 12 中删除它的更改(因为该版本需要 JDK6)。

于 2012-04-20T09:10:19.277 回答