5

java.lang.annotation.ElementType.TYPE_USEJDK8 で追加されたCheckers Framework参照。JDK7 で使用すると、次の警告が表示されます。

unknown enum constant java.lang.annotation.ElementType.TYPE_USE

これは妥当な警告ですが、無害だと思われる場合に警告を抑制するにはどうすればよいですか?

4

2 に答える 2

1

無害な未知の列挙型定数などというものは存在しないことがわかりました。コンパイラの警告を通過すると、実行時に例外が発生しました。

java.lang.ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy
    at sun.reflect.annotation.AnnotationParser.parseEnumArray(AnnotationParser.java:693) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:482) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:306) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:241) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:88) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70) ~[na:1.7.0_40]
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3168) ~[na:1.7.0_40]
    at java.lang.Class.getAnnotation(Class.java:3127) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationType.<init>(AnnotationType.java:131) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationType.getInstance(AnnotationType.java:84) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:221) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:88) ~[na:1.7.0_40]
    at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:70) ~[na:1.7.0_40]
    at java.lang.reflect.Method.declaredAnnotations(Method.java:714) ~[na:1.7.0_40]
    at java.lang.reflect.Method.getAnnotation(Method.java:700) ~[na:1.7.0_40]
    at com.google.inject.spi.InjectionPoint.getAtInject(InjectionPoint.java:466) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.spi.InjectionPoint.getInjectionPoints(InjectionPoint.java:664) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.spi.InjectionPoint.forInstanceMethodsAndFields(InjectionPoint.java:356) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.internal.MembersInjectorStore.createWithListeners(MembersInjectorStore.java:90) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.internal.MembersInjectorStore.access$000(MembersInjectorStore.java:34) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:42) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.internal.MembersInjectorStore$1.create(MembersInjectorStore.java:39) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.internal.FailableCache$1.apply(FailableCache.java:39) ~[guice-3.0-no_aop.jar:na]
    at com.google.inject.internal.util.$MapMaker$StrategyImpl.compute(MapMaker.java:549) ~[guice-3.0-no_aop.jar:na]
    ... 102 common frames omitted

つまり、を使用java.lang.reflect.Method.getAnnotation()するコードは実行時に失敗します。

私の場合、この問題はhttps://code.google.com/p/checker-framework/issues/detail?id=255が原因でした

于 2013-09-15T19:53:04.003 に答える
1

このコンパイル時エラーが発生した場合:

  unknown enum constant java.lang.annotation.ElementType.TYPE_USE

次に、Java 7 JDK を使用してコンパイルしていますが、コードは Java 8 JDK でのみ定義されている列挙型定数を参照しています。問題は、コードが enum 定数を参照するライブラリを使用している可能性があります。特に、Checker Framework リファレンスElementType.TYPE_USEに同梱されている型注釈。Checker Framework を使用できますが、Checker Framework マニュアルのセクション「 Java 7 とのクラスファイルの互換性」の指示に従って、Java 7 JVM でコードをコンパイルして実行することもできます。

于 2014-09-30T07:09:47.413 に答える