如何抑制“未知枚举常量”警告?

8

检查框架 (The Checkers Framework) 引用了 JDK8 中新增的 java.lang.annotation.ElementType.TYPE_USE。 当我在 JDK7 下使用它时,会收到以下警告:

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

这是一个合理的警告,但是对于我认为无害的情况,我该如何禁止它?

2个回答

2
事实证明,不存在无害的未知枚举常量。一旦我克服了编译器警告,运行时就会遇到异常:
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 引起的。

你的链接显示“内部服务器错误”(当然是10年后了..)- 为什么不用几句话解释一下错误的根源呢? - Ben

2
如果您遇到这个编译时错误:

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

如果您使用的是Java 7 JDK进行编译,但代码引用了仅在Java 8 JDK中定义的枚举常量,则需要注意。问题可能是代码使用了引用枚举常量的库。特别地,随Checker Framework一起提供的类型注释引用ElementType.TYPE_USE。您可以按照Checker Framework手册中“与Java 7的类文件兼容性”一节中的说明,使用Checker Framework来编译和运行Java 7 JVM中的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接