2012-09-25 15 views
9

コーディング中に、私は奇妙なJavaコンパイラの動作に遭遇しました。Javaコンパイラのエラーパズル:「内部クラスは静的宣言を持つことができません」 - 単純型以外

クラス(以下のソース)をコンパイルすると、コンパイラはNULLクラス変数にエラー( "inner classes cannot have static declarations")を発行します。これは予想通りです!

ただし、ZEROクラス変数にはエラーは生成されません。これは私が理解していない!

なぜこの単純な型の静的な宣言が可能だが、内部クラスのオブジェクトではないと思われるこの違い。

(のjavac -version:1.6.0_24)

public class Outer { 
    public static final Runnable HELLO = new Runnable() { 
     // No compiler error 
     public static final int ZERO = 0; 

     // Causes compiler error: "inner classes cannot have static declarations" 
     public static final Object NULL = null; 

     @Override 
     public void run() { 
      System.out.println("Hello " + ZERO + NULL); 
     } 
    }; 
} 
+0

私はそれは、プリミティブ変数が定数として扱われ、インライン*がコンパイルされるためだと思いますが、 'Object'リファレンスはそうではありません。私は、このYouTubeのビデオで、コンパイラが 'null'リファレンスを持つ定数をどのように扱うかを見てきました。http://www.youtube.com/watch?v=V1vQf4qyMXg&t=68m1s – Magicode

+0

null参照であるか新しいオブジェクトであるか() "の参照は違いはなく、どちらもコンパイラエラーを引き起こします。 – Morten

答えて

14

問題はインナークラスは非自明な定数と非定数を初期化するために必要とされる静的初期化子ブロックを持つことができないということです。

+1

+1;エラーメッセージはそれほど明白ではないと主張することができます。最初の宣言も 'static'です。 – maba

+0

また、内部クラスが静的初期化子ブロックを持つことができない理由もわかりません。 :| –

+0

内部クラスが静的初期化子ブロックを持つことができない場合、なぜ静的単純型クラス変数を初期化できますか? Java言語仕様のうち、いずれか一方を許可するが、他方を許可しない部分。 実際の問題は、単純な型の変数(静的フィールド)に対してコンパイルエラーが生成されないということです。 – Morten

関連する問題