2012-01-19 10 views
7

このような質問がたくさんあります。私はそれらの大部分を通過しましたが、実際には何もしませんでしたが、私は答えを出すことができませんでした:なぜこのコードはEclipseコンパイラでコンパイルされますが、javac(maven)ではコンパイルされません

私のGWT/GWTPクラスの1つに奇妙な問題があります。
クラスはEclipseコンパイラで正常にコンパイルされますが、javacコンパイラ(Maven)では失敗します。ビューはcom.gwtplatform.mvp.clientパッケージ内Viewインターフェースを指し

cannot find symbol symbol: class View

:私は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 
} 

私は同じように見え、うまく動作する他のクラスを持っています。
奇妙なことは、インポートの順序を変更するか、またはViewインターフェイスの正確なパッケージを指定すると、mavenで問題なくコンパイルできます。
は、具体的には、私は内部クラスを参照してください(日食で働いていたが、javacのではなかった)クラス間の循環継承の問題にいくつかの時間前に同様の問題があったcom.gwtplatform.mvp.client.View

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

のインポートを動かしました。しかし、私はそれが同じ問題であるかどうかはわかりません。

+1

問題の根本原因は不明ですが、内部インターフェイスはあまり美しくないため、依存関係がどこから来ているのか混乱する可能性があります。 – AndyT

+0

あなたは正しいと私はクラスのインターフェイスを移動すると、それを修正する(難しい私はそれを確認していない)と仮定します。私はちょうどこの奇妙な振る舞い(輸入の周りを動くことはコードをコンパイルするかどうか)の説明になるかもしれないのか不思議であった –

答えて

8

Eclipseのコンパイラは実際にはjavacコンパイラとは異なるコンパイラです。時には、彼らは行動で漂って離れ、通常はすぐに和解します。

これは、Javaのジェネリックが出てきたときに非常に顕著でした。日食は、javacが許可するジェネリックディレクティブや、日食が許すジェネリックの欠点を見つけた(あまりにもずっと前にどのように漂ったかを覚えていない)場合がありました。どちらの場合でも、javacは正しい実装である可能性が高くなります。

あなたの場合、内部クラスへのジェネリックリファレンスを使用して名前空間を汚染します。これは、Eclipseがjavacとは異なる優先順位で "View"に到達していることです。 JavacがJava言語ガイドラインで指定されているように注文を実装しているか、Javaのガイドラインが、矛盾しているような名前のクラスを解決するための「1つの真の順序」をまだ発音していないというのは、優れています。通常は、Javaで同じ完全修飾されていない名前を2回使用することは許されないため、これは問題ではありません。ただし、内部クラスでは、仕様は「回避」することができます。

私は名前を明示的にすることによって、(com.gwtplatform.mvp.client.ViewまたはMyPresenter.Viewが正しいものであるかどうかを知りません)ただ一つのビューに

public interface MyView extends View { 


} 

バインドになるだろう。

public interface MyView extends MyPresenter.View { 


} 

または

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


} 

あなたはコンパイラ依存的に間違った型に「結合」インターフェースの犠牲に該当しないこの方法。

+0

うわー。私は、Javaプロジェクトを「Eclipseだけのヒット」から「Maven」への変換中にこの問題に悩まされました。 Javaコンパイラは、欠落していないシンボルが見つからない場合に不平を言うので、この問題の原因を見つけるのは難しいです。 外部クラスの内部クラスをInner.Innerとして参照しますが、Outer.Inner.Innerのインポートを持つ内部は、Eclipseでのみ動作し、Mavenでは動作しません。 ありがとう! – JeroenHoek

関連する問題