:Java 9では、場合によってはパッケージの衝突が少し違って扱われるのはなぜですか?私は、Java 9で実験し、次のシナリオで探しています
実験1
- モジュール
- モジュールB
- の両方が、com.fooという名前の非空のパッケージを宣言しますをエクスポートしないでください。
java.lang.RuntimeException:モジュールBおよびモジュールの両方にパッケージcom.foo
- 両方が「C」からメインの実行第3モジュールC
によって要求されると、ランタイムエラーを与えます
実験前と同じ2
が、この時間の両方の輸出com.foo。 Cから主実行
結果:
java.lang.module.ResolutionException:モジュールBおよびエクスポートパッケージcom.fooはC
実験3
同じをモジュール2としましたが、今度はモジュールcom.fooをモジュールCで宣言しました。
コンパイルエラーが発生しました: エラー:(4、1)java:モジュールCがAとBの両方からパッケージcom.fooを読み込みます
なぜコンパイル時に最初の2つのケースがキャッチされないのですか?プログラムを実行する前に解決を妨げることに気づいていない実行時プロパティがありますか?
さらに、エラーメッセージに関する限り、実験2のエラーメッセージは、実験1で与えられたエラーメッセージよりも優れています。モジュールの1つがエクスポートしないと、最終結果異なるものになります。言い換えれば、異なるエラーメッセージを生成する背後にある考慮点は何ですか?
* "コンパイル時に最初の2つのケースが検出されないのはなぜですか?" *コンパイラはモジュールCで直接使用されていないパッケージの*拡張*分析を行っていないためです。 #3だけでも、コンパイラはパッケージ 'com.foo'を見ます。あなたの#2が 'com.foo'からクラスを' import'しようとすると、コンパイラはそれを取得するモジュールを見つけなければならないので、おそらくコンパイルに失敗します。 – Andreas
@Andreas、それについてはわからない - すべての同じパッケージが両方のモジュールでエクスポートされた後。私は実際にシルバープレート上のコンパイラにそれを与えています:)。たとえそれがキーワードを考慮して長い連鎖であったとしても、これは計算上複雑な問題ではありません。彼らはすでに読みやすさグラフを作成しているので、すべてがそこにあります。 – Vitaliy
それで、彼らは余分な(オプション)仕事をしませんでした。重要であると思う場合は、「なぜ?*」と尋ねるのではなく、あなたが強化要求を提出することをお勧めします。 – Andreas