在Java 5中实现ListingExecutorService

在Java 5中实现ListingExecutorService,java,guava,type-erasure,type-parameter,Java,Guava,Type Erasure,Type Parameter,在Java 5中,ExecutorService接口声明了以下方法: <T> List<Future<T>> invokeAll(Collection<Callable<T>> tasks) throws InterruptedException; 如果我想实现我自己的listingexecutorservice,我需要实现这两种方法,但我也不能有两种相同的擦除方法,所以这有点麻烦 有办法解决这个问题吗?更具体地说,有没有办法

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

<T> List<Future<T>> invokeAll(Collection<Callable<T>> tasks)
    throws InterruptedException;
如果我想实现我自己的
listingexecutorservice
,我需要实现这两种方法,但我也不能有两种相同的擦除方法,所以这有点麻烦

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


作为任何Guava人的旁注——Guava是否真的有必要重新声明此方法,因为它已经从
ExecutorService
继承了?

原始方法签名已被报告为一个bug,并已为JDK 6修复:

引用决议信息:

  • 是二进制兼容的
  • 源是否与ExecutorService的用户兼容
  • 对于一小部分开发人员,需要对源代码进行微小的更改 谁在未继承的情况下实现了ExecutorService AbstractExecutorService中的默认实现。一套 受影响的开发人员是创建复杂的 线程池应用程序,将它们放入 “并发火箭科学家”类别。他们通常会 感谢这一变化。可能的编译器错误很小 在源代码中修复

我能想到的实现这两个接口的唯一方法是

List invokeAll(Collection tasks)

删除泛型类型,记录为什么要这样做,并且要非常小心。

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

我认为您必须选择要编写的内容——Java 5或6。看起来您无法实现与两者兼容的
ExecutorService
。但我使用的是一个用Java6编写的库。编译时,我使用Guava(12版之前的版本)没有问题,因为类型擦除排列在一起。只有当我试图实现这个公共接口时,我才发现了冲突。如果我们想添加任何文档,Guava有必要重新声明这个方法——我们实际上是这样做的=/是的,但是如果OP坚持使用Java5,这对他没有帮助=/Louis是对的,但是我+1,因为这是一个很好的背景信息。我同意这应该是可行的,但是当我尝试它时,我使用的编译器产生了一个内部错误。YMMV,但你可能会自找麻烦。(再说一遍,也许接下来你会使用JDK6。)谢谢你的提醒,克里斯。在我的几个项目中,我使用JDK 6,但这一个我使用的是5。。。从我的手中。@thrutheality,它让我哭泣,不得不使用原始类型,但它确实起作用。谢谢你的建议。
List invokeAll(Collection tasks)