Разница в компиляторах между IntelliJ и Eclipse - PullRequest
1 голос
/ 01 декабря 2009

У меня есть класс, который выглядит следующим образом. Этот класс прекрасно компилируется в 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, я получаю ошибку компиляции. Он будет компилироваться только в IntelliJ, если я заменю все ссылки на <Callable<T>> на <? extends Callable<T>>. Например:

    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 Ответ

8 голосов
/ 02 декабря 2009

В 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 (а не в JDK 6 с уровнем соответствия 1,5)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...