2012-04-30 13 views
6

次のコード:なぜこのコードはjavacでコンパイルされませんが、eclipseではエラーはありません。

@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) 
@Constraint(validatedBy = { 
     MinTimeIntCoConstraintValidator.class, 
     MinTimeIntCoListConstraintValidator.class, 
     MinTimeDoubleCoConstraintValidator.class, 
     MinTimeDoubleCoListConstraintValidator.class, 
     }) 
@Documented 
public @interface MinTimeValueCo 
{ 
    int value(); 
    String message() default "value does not match minimum requirements"; 
    Class<?>[] groups() default { }; 
    Class<? extends Payload>[] payload() default {}; 
} 

は日食でコンパイルが、日/オラクルコンパイラでコンパイルに失敗します。

> MinTimeValueCo.java:19: illegal start of expression 
>  [javac]  }) 
>  [javac]  ^
>  [javac] 1 error 

これはMinTimeDoubleCoListConstraintValidator.class,後ためにカンマで起こりました。私はカンマを削除する場合

は、それが正常に動作します:私は、JDK 1.6.0.10を使用しています

@Constraint(validatedBy = { 
     MinTimeIntCoConstraintValidator.class, 
     MinTimeIntCoListConstraintValidator.class, 
     MinTimeDoubleCoConstraintValidator.class, 
     MinTimeDoubleCoListConstraintValidator.class 
     }) 


これがなぜ違法であり、eclipseでコンパイルされているのか知っていますか?

+0

最も興味深いものです。無関係なメモで、私はいつもEclipseがjavacを使用していると考えてきました。啓発に感謝します:)。 –

答えて

9

これはJava 6のjavacのバグです。一部の場所ではThe JLS allows trailing commasがあり、Eclipseコンパイラはこの標準に準拠していますが、Java 6では後続のカンマをどこでも使用できません。

コードjavacをJava 7からコンパイルして、-source 6 -target 6というオプション(Java 6互換のバイトコードを取得する)を試すことができます。バグがまだ残っている場合は、file it。それは修正されるかもしれません。

+0

ApperantlyこれはJava 7で修正されています。ありがとう! – oshai

0

MinTimeDoubleCoListConstraintValidator.classの後にコンマを有することにより、Javaコンパイラは、他の値があるはずと考えています。 Eclipseは末尾のカンマを受け入れますが、javacは受け入れません。

+0

私はそれをしました。なぜそれが起こったのか知っていますか? – oshai

+0

それはgrammaの問題です、コンパイラはあなたがMinTimeDoubleCoListConstraintValidator.class' '後の1つの以上のバリデータを持っていると思いますが、名前 – user1335794

+0

を与えるデコの答えに私のコメントを見ていない:はい末尾のカンマがJLS –

1

あなたはそれがリスト内の別の表現を探しているMinTimeDoubleCoListConstraintValidator.class,の終わりに,を持っています。

+0

によって許可されていますしかし、なぜ日食に間違いがないのですか? – oshai

+3

JLSに基づいて末尾のカンマを使用できます。http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6およびhttp://docs.oracle.com /javase/specs/jls/se7/html/jls-9.html#jls-9.7 –

+0

これはjavacがJLSに従わないことを意味しますか? – oshai

0

何らかの種類の制約を宣言しているようです。最後の制約の後に余分なカンマ(,)を置いているので、コンパイラはあなたがすでに持っているものと一緒に他の値を期待します。これを試してください:

@Constraint(validatedBy = { 
     MinTimeIntCoConstraintValidator.class, 
     MinTimeIntCoListConstraintValidator.class, 
     MinTimeDoubleCoConstraintValidator.class, 
     MinTimeDoubleCoListConstraintValidator.class 
     }) 
+0

Decoの答えに私のコメントを見てください:末尾のカンマはJLSによって許可されています。 –

関連する問題