编译器IntelliJ和Eclipse之间的区别

时间:2009-12-01 18:14:48

标签: java eclipse intellij-idea

我有一个如下所示的课程。这个类在Eclipse build 20090920-1017上编译得很好:

public class MyScheduledExecutor implements ScheduledExecutorService {

    ...

    public <T> List<Future<T>> invokeAll(Collection<Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException {
        ...
    }


    public <T> List<Future<T>> invokeAll(Collection<Callable<T>> tasks) throws InterruptedException {
        ...
    }


    public <T> T invokeAny(Collection<Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
        ...
    }


    public <T> T invokeAny(Collection<Callable<T>> tasks) throws InterruptedException, ExecutionException {
        ...
    }

    ...

}

但是,如果我尝试在IntelliJ 9中编译,我会收到编译错误。如果我用<Callable<T>>替换<? extends Callable<T>>的所有引用,它将仅在IntelliJ中编译。例如:

    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
        ...
    }

不幸的是,如果我再次尝试在Eclipse中编译修改后的类,我会收到编译错误。

Name clash: The method invokeAll(Collection<? extends Callable<T>>) of type 
SingleScheduledExecutor has the same erasure as invokeAll(Collection<Callable<T>>) of
type ExecutorService but does not override it

有没有办法可以创建一个实现ScheduledExectorService的类,它将在IntelliJ和Eclipse下编译?两个IDE似乎都配置为使用Java 1.5,这对我的部署平台来说是正确的。

1 个答案:

答案 0 :(得分:8)

在Java 6中,ExecutorService声明了以下方法(例如):

<T> T invokeAny(Collection<? extends Callable<T>> tasks)
            throws InterruptedException,
                   ExecutionException

但是在Java 5中,在ExecutorService中声明了相同的方法:

<T> T invokeAny(Collection<Callable<T>> tasks)
            throws InterruptedException,
                   ExecutionException

我没有安装Java 5并且无法使用Eclipse Java EE Galileo 20090920-1017重现错误(我在Ubuntu下并且sun-java5-jdk已从Karmic的存储库中删除而且我太懒了手动安装它,但实际上,我认为 Eclipse 是正确的。

您确定在IntelliJ IDEA中使用JDK 5(而不是符合1.5级别的JDK 6)吗?