2013-01-10 5 views
8

のない静的インポートは、コードの次の簡単な例で考えてみましょう:私たちは、このコードをコンパイルしようとする場合、我々は、エラー・メッセージが表示されますパッケージ名

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 

これは可能性がこの静的インポートを導入して解決してください

import static ... TestStaticImport.Branches.*

しかし、(私にとって)現時点では不可解なものを開始:このソリューションが正常に動作します

クラスTestStaticImportが空のルートパッケージに移動されますまで、すべてがうまく、コンパイルされ、すなわちいずれかが存在しません

package blablabla;このJavaファイルの先頭にあります。

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

java: package TestStaticImport does not exist

だから、実際には二つの質問があります。

1)主な質問:なぜそれは空のディレクトリからimport staticには不可能でしょうか?

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


P.S.してください、空のパッケージが醜いスタイルなどであることを教えてください。この質問は単なる理論上の問題です。

+0

...私の知る限り見ることができるようにそれが限界です。 – fge

答えて

11

Java language specification無名パッケージから任意の輸入禁止:

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

+0

そして関連するものは7.5.3/4です。 – assylias

+0

仕様にリンクしている正確な答えをありがとうございました! – Andremoniy

5

古くから、Javaの発明者はJavaの種類をファイルにマップしなければならなかったため、コンパイラは実際の作業を行うことができました。彼らは、パッケージをフォルダやタイプにファイルにマップすることに決めました。それはかなりうまくいった。特に、初心者のための感情的な背景を設定しました。「私はあなたが大嫌いです。しかし、私は逃げる。

デフォルトのパッケージは問題はありませんが、それは明確に定義されたフォルダがないためです。comのパッケージをお持ちの場合は、comというフォルダがありますが、デフォルトのパッケージのフォルダの名前は何ですか?

デザイナーは、importとデフォルトパッケージが混在しないと判断しました。実際には、パッケージがないもの(つまりstatic*のないimport TestStaticImportもインポートできない場合)をインポートしようとするとエラーが発生します。 How to import a class from default package

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

Javaのコーナーケースのように、解決策はありません。

も参照してください。私は最初の質問のためにあなたと同じ問題が発生していたしましたIn Java- "Static Members of the default package cannot be imported"- Can some one explain this statement?

関連する問題