Почему это нормально компилируется в Maven, но дает ошибки в Eclipse? - PullRequest
2 голосов
/ 16 июля 2010

Я вхожу в проект с открытым исходным кодом, в настоящее время построенный с использованием Maven2.Я импортировал проект в Eclipse, и этот фрагмент кода доставляет мне проблемы:

public static enum HierarchyType implements Function<MonetarySummary, SumOfMoney>, Predicate<Txaction> {
    EARNINGS {
        @Override
        public SumOfMoney apply(MonetarySummary summary) {
            return summary.getEarnings();
        }

        @Override
        public boolean apply(Txaction txaction) {
            return txaction.getAmount().signum() > 0;
        }
    },
    SPENDING {
        @Override
        public SumOfMoney apply(MonetarySummary summary) {
            return summary.getSpending();
        }

        @Override
        public boolean apply(Txaction txaction) {
            return txaction.getAmount().signum() < 0;
        }
    },
    NET {
        @Override
        public SumOfMoney apply(MonetarySummary summary) {
            return summary.getNet();
        }

        @Override
        public boolean apply(Txaction txaction) {
            return true;
        }
    }
}

Оба Function и Predicate имеют apply методы (они из общего достояния Google):

public interface Function<F, T> {
   T apply(@Nullable F from);
   ...
}

public interface Predicate<T> {
   boolean apply(@Nullable T input);
}

Вот ошибка, которую я получаю, только в Eclipse:

Description Resource    Path    Location    Type
Name clash: The method apply(F) of type Function<F,T> has the same erasure as apply(T) of type Predicate<T> but does not override it    
Name clash: The method apply(F) of type Function<F,T> has the same erasure as apply(T) of type Predicate<T> but does not override it    
Name clash: The method apply(F) of type Function<F,T> has the same erasure as apply(T) of type Predicate<T> but does not override it    
Name clash: The method apply(T) of type Predicate<T> has the same erasure as apply(F) of type Function<F,T> but does not override it    
Name clash: The method apply(T) of type Predicate<T> has the same erasure as apply(F) of type Function<F,T> but does not override it    
Name clash: The method apply(T) of type Predicate<T> has the same erasure as apply(F) of type Function<F,T> but does not override it    

Итак, что здесь происходит?Это флаг компилятора?

Для чего он стоит, я использую Eclipse 3.6, а maven строит с помощью Java 1.6 на моем OSX:

Version: Helios Release
Build id: 20100617-1415

javac -version
javac 1.6.0_20

Ответы [ 3 ]

2 голосов
/ 10 августа 2010

Проблема здесь в том, что стирание (все, что находится между угловыми скобками) удаляется во время компиляции, что делает параметры двух примененных методов идентичными.Типы возврата различаются, но тип возврата не является частью сигнатуры метода в Java.

Sun JDK и Eclipse до 3.5 не жалуются на эту двусмысленность (я думаю, что они делаютна самом деле посмотрите на возвращаемые типы), но Eclipse 3.6 исправил эту ошибку .

Она должна работать в Eclipse 3.5, но, вероятно, только вопрос времени, пока другие JDK исправят это тоже, поэтому я предлагаю реализовать методы явно или переименовать один из них.

0 голосов
/ 29 июля 2011
0 голосов
/ 16 июля 2010

Да, я так думаю. Я не рассматривал эту ошибку подробно, но Eclipse позволяет вам точно настроить множество сообщений об ошибках / предупреждений для компилятора Java. Вы можете попытаться найти тот, который относится к этому сообщению (спросите еще раз здесь на SO, если вы действительно не можете его найти) и отклонить его, если повезет, что "решит" вашу проблему.

Вероятно, вам следует решить основную проблему, так как это сообщение не выдается. Но я недостаточно хорошо понимаю дженерики, чтобы это исправить.

Что-то еще, что может быть вовлечено, является версией компилятора Java. Проверьте, какой уровень версии компилятора установлен в Eclipse, а какой вызывается в Maven; они вполне могут быть разными.

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