在Java 5中实现ListeningExecutorService

时间:2012-04-19 21:42:56

标签: java guava type-erasure type-parameter

在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. / p>

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

作为任何番石榴人的旁注 - 番石榴实际上是否有必要重新声明这种方法,因为它已经从ExecutorService继承了?

3 个答案:

答案 0 :(得分:4)

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

引用决议信息:

  
      
  • 是二进制兼容的。
  •   
  • 与ExecutorService的用户源代码兼容
  •   
  • 需要对少量开发人员进行少量源代码更改   谁已经实现了ExecutorService而没有继承   AbstractExecutorService中的默认实现。这套   受影响的开发人员是创建复杂的   线程池应用程序,将它们放入   “并发火箭科学家”类别。他们一般会   欣赏这种变化。可能的编译器错误是微不足道的   修复源代码。
  •   

答案 1 :(得分:3)

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

List invokeAll(Collection tasks)

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

答案 2 :(得分:2)

我们完成这项工作的方式是在我们的bootclasspath中覆盖JDK的ExecutorService接口。您可以在项目编译期间执行类似的操作。查看我们设置的最简单方法可能是the change that removed it for release 12(因为该版本需要JDK6)。