3

パッケージabcにクラス名ClassXがあり、クラスabxClassXをインポートしたい場合

私がそうするのを妨げているJavaの制限はありますか? 使用法に関しては、インポートされたクラスの完全修飾名をいつでも使用できますよね?

Eclipse はこのインポートを解決できないようです。Java 自体に問題の原因となっている制限があるかどうかを知る必要があります。

次のコードは合法ですか:

a\b\c\ClassX.java :

package a.b.c;
public class ClassX {
//
}

a\b\x\ClassX.java :

package a.b.x;

import a.b.c.ClassX;

public class ClassX {
    public static void main(String[] args) {
        a.b.c.ClassX newObj = new a.b.c.ClassX();
    }
}

いいえの場合、なぜですか?

4

2 に答える 2

4

より正確には

  • クラスをインポートするクラスと同じ単純な名前のクラスをインポートすることが許可されていないわけではありません。
  • ただし、既にインポートされているクラスと同じ名前をインポート クラスに付けることはできません。

そうしようとすると、次のエラー メッセージが表示されます[NameOfImportingClass] is already defined in this compilation unit

この制限の目的は、名前のあいまいさや衝突を防ぐことです。

たとえば、インポートがなければ、以下はすべて合法です。

package a;
class B{}

package b;
class B{
   a.B objectPackageaB; //legal - full-package-name so no ambiguity
   b.B objectPackagebB; //legal - full-package-name so no ambiguity
   B objectB; //legal, as now it can only represent B from package "b" -> b.B 
}

追加してみましょうimport a.B

package b;    
import a.B; // <---

class B {
     b.B objectbB;  //still legal, full-package-name so no ambiguity
     a.B objectaB;  //still legal, full-package-name so no ambiguity
     B objectB;   //ambiguous, so ILLEGAL. Which type B should represent? a.B OR b.B?
}

Java がそのような状況を防げない場合は、どの型B objectBを表すかを決定する必要があります。

2 つのオプションがあります。

  1. インポートしb.Bているタイプを表します。しかし、それはパッケージから使用することを意味し、プログラマーを混乱させるだけの冗長/デッドコードであることを意味します。Baa.Bimport a.B;
  2. インポートさa.Bれるタイプを表します。しかし、それは不自然に感じるでしょう。内部では、他のタイプを表しているからです! .class B{ }B

上記の解決策はどちらも良くありません。

問題に対する適切な解決策がない場合、最善の選択肢は表示されないようにすることです。

于 2011-06-13T08:40:08.937 に答える
1

いいえと思いますが、代わりに(Class_X_、Class_x_なし)とa.b.c.Classx newObj = a.b.c.ClassX()書いてください。そうすれば機能するはずです:-)a.b.c.ClassX newObj = a.b.c.ClassX()

于 2011-06-13T09:44:40.033 に答える