互換性のないタイプが見つかりました:必須:アノテーションのデフォルト列挙
-
07-07-2019 - |
質問
[javac] C:\ws\galileo\test\Cacheable.java:13: incompatible types
[javac] found : com.io.CacheType
[javac] required: com.io.CacheType
[javac] public CacheType id() default CacheType.COMMON;
私は本当にこれを取得しません。 Springのキャッシングインターセプターをカスタムでビルドするプロジェクトがあります。これは、EhCacheを指すキャッシュ名によるルックアップであり、aop-autoproxyを使用してCacheableAspect(これはキャッシングインターセプター)をロードします。アノテーションでデフォルト値を使用すると、ANTによって以下のコンパイラエラーが発生します。最新のJDK(現在1.6 16)に更新して、Antスクリプトでソース/ターゲットレベルを設定しようとしましたが、成功しませんでした。デフォルト値を削除し、すべての領域で値を指定するように強制すると、ant fineでコンパイルされます。
これは常にEclipseで機能し、以前のデフォルト値で完全に実行される単体テストがありました。
何が得られますか? antを使用して構成を単純にエコーし、ant fine(およびeclipse)でコンパイルしたプロジェクト(春ではない)をビルドしようとしました。
それは、それがどういうわけか春の自動プロキシであるかもしれないと私に言う?しかし、なぜコンパイラは生成された型名を教えてくれないのですか? GRRRR。何か考えはありますか?
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.io.CacheType;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Cacheable {
public CacheType value() default Cachetype.COMMON;
}
public enum CacheType {
COMMON("common"),
PERSISTENT("persistent";
private String cache;
CacheType(String cache) {
this.cache = cache;
}
public String cache() {
return this.cache;
}
}
解決
まだJDK 6u25に存在しますが、デフォルト値にパッケージを追加するとうまくいきません:
CacheType value() default com.io.CacheType.COMMON;
他のヒント
こちらをご覧ください: http://bugs.sun.com/view_bug.do?bug_id=6512707 これが問題の原因である可能性があります。
それで、ほんの少しの更新。バグトラッカーはバグをクローズされたものとして表示し、バグの新しい開始点に反論したいようです。この例でこのバグに遭遇したとき、コンパイル時の注釈プロセッサを中心に展開します。保存期間はRUNTIMEであるため、コンパイル時の注釈プロセッサは不要であるため、コンパイル時の注釈プロセッサがコンパイルプロセスを爆破しているようです。 NetBeansを使用していて、Build->プロジェクトのプロパティでコンパイル時のコンパイル時アノテーションを有効にしているときはいつでも、一連のエラーが発生します。
この問題の新しいバグチケットを開くことを試みますが、今は簡単な回避策を渡すと思いました。
まだjavac 1.6.0_26を使用して存在しています。デフォルト値を指定するときに完全修飾型名を使用するyurezの回避策は引き続き機能します。
このバグは1.6.0_31および1.7.0_03で解決されているため(以前のバージョンでも解決される可能性があります)、Javaコンパイラをアップグレードするだけです。
これは、同じソースファイルでCacheableとCacheTypeを定義してから、「com.io.CacheType」をインポートすることによって引き起こされるのだろうか。これにより、コンパイラは" com.io.CacheType"と呼ばれる2つのクラスがあると考えるようになります。
ソースファイル全体または何かを投稿できますか?投稿したコードは、異なるソースファイルからコピー/貼り付けされたようで、タイプミスがたくさんあります。
通常、CacheType列挙型が別のソースファイルにある場合、CacheType.COMMONにタイプミスがあった場合、次の方法で常にトリックを実行する必要があります。
public @interface Cacheable {
public CacheType value() default CacheType.COMMON;
}
完全修飾型名で動作します。
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.io.CacheType;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Cacheable {
public CacheType value() default com.io.Cachetype.COMMON;
}