13

次の簡単なコード例を考えてみましょう。

public class TestStaticImport {
    static enum Branches {
        APPLE,
        IBM
    }
    public static void doSomething(Branches branch) {
        if (branch == APPLE) {
            System.out.println("Apple");
        }
    }
}

このコードをコンパイルしようとすると、エラーメッセージが表示されます。

java: cannot find symbol
  symbol:   variable APPLE
  location: class TestStaticImport

これは、これの静的インポートを導入することで解決できますenum

import static..。TestStaticImport.Branches.*

しかし、この瞬間に(私にとって)理解できないことが始まります:

TestStaticImportこのソリューションは正常に機能し、クラスが空のルートパッケージに移動されるまで、つまり何も存在しないまで、すべてが適切にコンパイルされます。

package blablabla;このJavaファイルの先頭。

コード行:import static TestStaticImport.Branches.*;Intellij IDEAでは有効なコードとして強調表示されています(情報のためだけにIDEの名前は関係ありません)が、そのようなコードをコンパイルしようとすると、次のエラーが表示されます:

java: package TestStaticImport does not exist

したがって、実際には2つの質問があります。

1)主な質問import static空のディレクトリから移動できないのはなぜですか?

2)静的インポートを除いて、名前だけを使用して(つまり、APPLEの代わりに)列挙型のフィールドへのコード参照を許可する別の方法(存在する場合)は何ですか?Branches.APPLE


PS空のパッケージは醜いスタイルなどだと言わないでください。この質問は単なる理論上の問題です。

4

2 に答える 2

17

Java言語仕様では、名前のないパッケージからのインポートは禁止されています。

名前のないパッケージ(§7.4.2)の型には正規名がないため、あらゆる種類のインポート宣言での正規名の要件は、(a)名前のないパッケージの型をインポートできないこと、および(b)静的メンバーを意味します。名前のないパッケージ内のタイプのはインポートできません。そのため、§7.5.1、§7.5.2、§7.5.3、および§7.5.4はすべて、名前のないパッケージに型(またはその静的メンバー)をインポートしようとすると、コンパイル時エラーが必要になります。

于 2013-01-10T12:55:35.743 に答える
5

古代では、Javaの発明者は、コンパイラが実際の作業を行えるように、Javaタイプをファイルにマップする必要がありました。彼らは、パッケージをフォルダーにマップし、タイプをファイルにマップすることにしました。それはかなりうまくいきました。それは特に新参者の感情的な背景を設定しました:「私はあなたが嫌い​​です。私を台無しにしないでください。」しかし、私は逸脱します。

ただし、デフォルトのパッケージには明確に定義されたフォルダーがないため、問題があります。パッケージがある場合、どこかcomにフォルダがあることを知っていcomますが、デフォルトのパッケージのフォルダの名前は何ですか?

そのため、設計者はimport、デフォルトのパッケージを混在させないことを決定しました。実際、パッケージがないものをインポートしようとするとエラーが発生します(つまり、パッケージがないimport TestStaticImportstatic失敗*します)。デフォルトパッケージからクラスをインポートする方法を参照してください

したがって、問題は静的インポートではなく、デフォルトパッケージからインポートしようとすることです。

Javaの他のいくつかのコーナーケースと同様に、解決策はありません。

参照:Javaの場合-「デフォルトパッケージの静的メンバーはインポートできません」-誰かがこのステートメントを説明できますか?

于 2013-01-10T13:00:51.870 に答える