2013-05-21 12 views
14

javacがパブリック列挙型の静的ネストされたクラスのアノテーションを認識しないjavacコンパイルのエラーが発生しました。静的なネストされたクラスからenumを移動すると、コンパイルエラーは解決されました。誰もjavacが失敗した理由を知っていますか?これはJavaコンパイラのバグですか?それとも私が気づいていないJavaのニュアンスがありますか?パブリック列挙型の静的ネストされたクラスのアノテーションをコンパイルできません

以下はスタンドアロンのテストケースです。

をコンパイルに失敗:

package test; 

import test.AnnotationBug.NestedClassWithEnum.ParticipantType; 

import lombok.Data; 
import lombok.NoArgsConstructor; 

import com.googlecode.objectify.annotation.Embed; 

public class AnnotationBug { 

    ParticipantType type; 

    @Embed 
    @Data 
    @NoArgsConstructor 
    public static final class NestedClassNoEnum { 
    } 

    @Embed 
    @Data 
    @NoArgsConstructor 
    public static final class NestedClassWithEnum { 
    ParticipantType type; 

    public enum ParticipantType { 
     ORGANIZER, 
     REGISTERED, 
     WAIT_LISTED 
    } 
    } 
} 

コンパイル出力:

$ javac -classpath /home/avaliani/projects/jars/objectify-4.0b2.jar:/home/avaliani/projects/jars/lombok.jar test/AnnotationBug.java 
test/AnnotationBug.java:20: error: cannot find symbol 
    @Embed 
^
    symbol: class Embed 
    location: class AnnotationBug 
test/AnnotationBug.java:21: error: cannot find symbol 
    @Data 
^
    symbol: class Data 
    location: class AnnotationBug 
test/AnnotationBug.java:22: error: cannot find symbol 
    @NoArgsConstructor 
^
    symbol: class NoArgsConstructor 
    location: class AnnotationBug 

コンパイル:

package test; 

// import test.AnnotationBug.NestedClassWithEnum.ParticipantType; 

import lombok.Data; 
import lombok.NoArgsConstructor; 

import com.googlecode.objectify.annotation.Embed; 

public class AnnotationBug { 

    ParticipantType type; 

    @Embed 
    @Data 
    @NoArgsConstructor 
    public static final class NestedClassNoEnum { 
    } 

    @Embed 
    @Data 
    @NoArgsConstructor 
    public static final class NestedClassWithEnum { 
    ParticipantType type; 

    } 

    public enum ParticipantType { 
    ORGANIZER, 
    REGISTERED, 
    WAIT_LISTED 
    } 
} 

は、エラーなしでコンパイル:

$ javac -classpath /home/avaliani/projects/jars/objectify-4.0b2.jar:/home/avaliani/projects/jars/lombok.jar test/AnnotationBug.java 

指摘観光:

1)コンパイルの失敗の行番号をメモします。 NestedClassNoEnumの注釈の解析に問題はありません。

2)Javaバージョン:

$ java -version 
java version "1.7.0_21" 
OpenJDK Runtime Environment (IcedTea 2.3.9) (7u21-2.3.9-0ubuntu0.12.10.1) 
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode) 
+3

注釈の1つまたはいくつか/すべてを削除して、それらのいずれかに分離できるかどうか確認しましたか?たとえば、リンクされたコードに '@ Embed'と' @ NoArgsConstructor'を唯一使用しているようです。はるかに小さく、よりシンプルなクラスで再現できますか? – ajp15243

+0

こんにちは@ ajp15243。あなたのメモに感謝します。私はテストケースをスタンドアローンのテストケースに変更しました。 Embedアノテーションを削除しようとしましたが、コンパイラはNoArgsConstructorとDataアノテーションをコンパイルできませんでした。だから、問題はアノテーションではないと確信しています。 – Amir

+0

@Amir確かに、私の間違い - あなたの最初の例を再現し、あなたが参照しているライブラリのアノテーションのコードをコピーし、oracle jdk 7u10でうまくコンパイルしました。バグのように見えます。 – assylias

答えて

8

あなたは静的クラスのインポートを削除した場合、コードは罰金コンパイル、注意してください[以下のコードを参照してください。私は瓶を持っていなかったように私は@Embedアノテーションを使用していませんそれは違いはありません:

//import NestedClassWithEnum.ParticipantType; 
import lombok.Data; 
import lombok.NoArgsConstructor; 


public class AnnotationBug { 

    NestedClassWithEnum.ParticipantType type; 


    @Data 
    @NoArgsConstructor 
    public static final class NestedClassNoEnum { 
    } 


    @Data 
    @NoArgsConstructor 
    public static final class NestedClassWithEnum { 
     ParticipantType type; 

     public enum ParticipantType { 
      ORGANIZER, 
      REGISTERED, 
      WAIT_LISTED 
     } 
    } 
} 

理由は、列と静的なクラスのクラスの読み込みに関連しているようです。 Enums are eagerly loaded静的クラスが遅延ロードされるためです。 Javaはコンパイル時に停止しようとしている可能性がありますが、それは推測です。

編集: paulとの議論では、上記の推測は正しくありません。

+0

クラスのロードは実行時に行われ、これはコンパイル時の問題です。しかし、観察のために+1。 –

+0

@PaulBellora:私は、列挙型が熱心に読み込まれるということを意味しています[静的クラスが遅れて読み込まれているところです[http://stackoverflow.com/questions/9408322/java-lazy-loading-of-enum-instances]。 Javaはコンパイル時に停止しようとしている可能性がありますが、それは推測です。 – Lokesh

+0

その投稿を誤解している可能性があります。列挙型クラスがロードされると、列挙型定数*が熱心に読み込まれます(静的initの一部です)。しかしenumクラス自体は、他のクラスとまったく同じようにロードされません。 –

関連する問題