在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
继承了?
答案 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)。