30

これらのパッケージとクラスがあるとしましょう:

package p1;

public class A1 {
    public static void a() {}
}

package p2;

public class A1 {
    public static void a() {}
}

package p3;

import static p1.A1.a;
import static p2.A1.a;

public class A1 {
    public static void test() {

    }
}

package でメソッドの静的インポートが合法である(コンパイル時エラーにならない)のはp3なぜですか?test()そのような使用法はコンパイル時エラーを引き起こすため、メソッドでそれらをさらに使用することはできません。

クラスの通常のインポートと同じではない理由。A1パッケージからクラスをインポートしたいとしp1ましょp2p3:

package p3;
import p1.A1;
import p2.A1;

このようなインポートは違法であり、コンパイル時エラーが発生します。

4

3 に答える 3

44

メソッドの静的インポートのあいまいさは、メソッド呼び出しの時点で解決できます。

たとえば、次のような 2 つのメソッドの静的インポートがあるとします。

void frobnicate(int i);
// and
void frobnicate(boolean b);

その後、両方をインポートして使用できます。これは、コンパイラーが、渡された引数に基づいてどちらを使用するかを判断できるためです (frobnicate(1)最初の引数をfrobnicate(true)呼び出し、2 番目の引数を呼び出します)。

クラスでは、それFoobar a;は不可能です。2 つのクラスのどちらが必要かを伝えるには、それだけでは十分ではありませFoobarん。

また、 1 回の静的インポートで複数の名前をインポートできることにも注意してください。JLS(強調鉱山)の関連セクションによると:

single-static-import 宣言は、指定された単純な名前を持つアクセス可能なすべての静的メンバーを型からインポートします。

たとえば、frobnicate上記の 2 つのメソッドが同じクラスにある場合、1 回のstaticインポートで両方をインポートできます。

于 2012-10-22T10:37:15.890 に答える
2

これは、これらすべてのクラスに同じ名前を付けたためです。この静的メソッドを呼び出すたびに、最もローカルなクラスが検索されます。この場合は、静的メソッド a() を含まない p3 の A1 です。クラス名は一意である必要があり、別の名前と同じであってはならないことを常に覚えておいてください。

于 2012-10-22T10:36:59.633 に答える
0

言語仕様に裏打ちされていないので、メソッドはオーバーロードできますが、フィールド/タイプはオーバーロードできないと思います。したがって、javaでは、異なるクラスから同じ名前のメソッドをインポートできます。

ただし、同じシグニチャの2つのメソッドを同じクラスに存在させることはできません。それらは輸入によっても許可されるべきではありません。

2つのメソッドの署名が異なる場合でも、それは悪い考えです。名前の意味は非常に重要であり、明確にする必要があります。1つのクラスからオーバーロードされたメソッドを処理できますが、クラス全体での「オーバーロード」は一筋縄ではいきません。

于 2012-10-22T15:26:19.090 に答える