почему этот код компилируется с компилятором eclipse, а не с javac (maven) - PullRequest
8 голосов
/ 19 января 2012

Есть куча таких вопросов. Я прошел большинство из них, но на самом деле ни одного, но я не смог придумать ответ:

У меня странная проблема в одном из моих классов GWT / GWTP.
Класс прекрасно компилируется с помощью компилятора Eclipse, но не работает с компилятором javac (Maven).

//additional imports
import com.gwtplatform.mvp.client.PresenterWidget;
import com.gwtplatform.mvp.client.View;

public class MyPresenter extends PresenterWidget<MyPresenter.MyView> {

    public interface MyView extends View {


    }

    some code
}

Когда я пытаюсь скомпилировать с Maven, я получаю следующую ошибку:

не может найти символ символа: класс Просмотр

Представление относится к интерфейсу View в пакете com.gwtplatform.mvp.client.

У меня есть другие классы, которые выглядят одинаково и работают нормально.
Странно то, что если я меняю порядок импорта или указываю точный пакет интерфейса View, он без проблем компилируется в maven.
Если быть точным, я перенес импорт на com.gwtplatform.mvp.client.View

import com.gwtplatform.mvp.client.View;
//additional imports
import com.gwtplatform.mvp.client.PresenterWidget;

Некоторое время назад у меня была похожая проблема с проблемой циклического наследования между классами, которые ссылаются на внутренние классы (работали в eclipse, но не в javac). Однако я не уверен, что это та же проблема.

1 Ответ

9 голосов
/ 19 января 2012

Компилятор Eclipse на самом деле отличается от компилятора javac.Иногда они расходятся в поведении, обычно быстро примиряются.

Это было очень заметно, когда появились дженерики Java.Были случаи, когда eclipse либо обнаруживала ошибку с помощью директивы generics, которую разрешил бы javac, либо javac обнаружила ошибку с генериками, которые допускает eclipse (не могу вспомнить, в каком направлении она разошлась, слишком давно).В любом случае, javac, скорее всего, будет правильной реализацией.

В вашем случае вы загрязняете пространство имен ссылкой на родовой класс на внутренний класс.Скорее всего, затмение достигает «Вид» в другом порядке приоритетов, чем javac.Превосходно, что либо Javac реализует порядок, указанный в рекомендациях по языку Java, либо рекомендации Java еще не объявили «единый истинный порядок» разрешения конфликтующих одноименных классов.Обычно это не проблема, поскольку недопустимо дважды использовать одно и то же неполное имя в Java;однако, с внутренними классами спецификации могут быть как бы «обойдены».

Я бы сделал

public interface MyView extends View {


}

привязкой только к одному представлению (не знаю, если com.gwtplatform.mvp.client.View илиMyPresenter.View правильный), сделав имя явным.

public interface MyView extends MyPresenter.View {


}

или

public interface MyView extends com.gwtplatform.mvp.client.View {


}

Таким образом, вы не станете жертвой "привязки" интерфейса к неправильномувведите в зависимости от компилятора.

...