java.lang.Object#getClass() 的 Eclipse 外部空注释
Eclipse external null annotation for java.lang.Object#getClass()
我正在使用 Eclipse Mars 中可用的外部空注释工具。我正在尝试为 java.lang.Object#getClass()
添加外部注释,但似乎无法获得正确的签名。我尝试了以下变体:
@NonNull Class<?> getClass() [()L1java/lang/Class<*>;]
@NonNull Class<@NonNull ?> getClass() [()L1java/lang/Class<*1>;]
但在将调用 getClass()
的结果传递给接受 Class<?>
实例的方法时继续收到警告,其中该参数用 @NonNull
注释。
下面是重现问题的最小 Eclipse Mars 项目的相关文件(此示例使用上面的第一个空注释变体,但在使用第二个变体时我也收到相同的警告):
Windows64 位
的 Eclipse Mars 版本 (4.5.0; 20150621-1200)
甲骨文 JDK1.8.0_60
src/bar/Foo.java
package bar;
public class Foo {
private static void printType(Class<?> type) {
System.out.println(type.getName());
}
public static void main(String[] args) {
Foo foo = new Foo();
printType(foo.getClass());
}
}
src/bar/package-info.java
@org.eclipse.jdt.annotation.NonNullByDefault
package bar;
annotations/java/lang/Object.eea
class java/lang/Object
getClass
()Ljava/lang/Class<*>;
()L1java/lang/Class<*>;
.settings/org.eclipse.jdt.core.prefs(部分)
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=enabled
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=warning
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
...
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
...
org.eclipse.jdt.core.compiler.compliance=1.8
...
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
...
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
org.eclipse.jdt.core.compiler.problem.nullReference=error
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
...
org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
...
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
...
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
...
org.eclipse.jdt.core.compiler.source=1.8
.classpath
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="annotationpath" value="/null-annotation-test/annotations"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="org.eclipse.jdt.annotation_2.0.100.v20150311-1658.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
对于上述项目,我在 Foo.java 的第 10 行(调用 printType
的地方)收到以下警告:
Null type safety (type annotations): The expression of type 'Class<capture#of ? extends Foo>' needs unchecked conversion to conform to '@NonNull Class<?>'
这与我在没有外部空注释的情况下收到的警告相同。
如何为 java.lang.Object#getClass()
正确创建外部空注释以移除此警告?还是我的问题在 printType
?
的声明中
Louis Wasserman 是正确的,在类型检查方面没有 one getClass()
方法,但是每个 class 都有自己的方法和专门的签名.因此,.eea 文件中的签名永远不会匹配实际的 getClass() 方法。
我提交了一个 RFE 将更多关于 getClass()
的特殊知识放入编译器,这样这个野兽就不需要外部注释了。
编辑:此功能已实现并将随 Eclipse 4.6 (Neon) 一起发布。
我正在使用 Eclipse Mars 中可用的外部空注释工具。我正在尝试为 java.lang.Object#getClass()
添加外部注释,但似乎无法获得正确的签名。我尝试了以下变体:
@NonNull Class<?> getClass() [()L1java/lang/Class<*>;]
@NonNull Class<@NonNull ?> getClass() [()L1java/lang/Class<*1>;]
但在将调用 getClass()
的结果传递给接受 Class<?>
实例的方法时继续收到警告,其中该参数用 @NonNull
注释。
下面是重现问题的最小 Eclipse Mars 项目的相关文件(此示例使用上面的第一个空注释变体,但在使用第二个变体时我也收到相同的警告):
Windows64 位
的 Eclipse Mars 版本 (4.5.0; 20150621-1200)
甲骨文 JDK1.8.0_60
src/bar/Foo.java
package bar;
public class Foo {
private static void printType(Class<?> type) {
System.out.println(type.getName());
}
public static void main(String[] args) {
Foo foo = new Foo();
printType(foo.getClass());
}
}
src/bar/package-info.java
@org.eclipse.jdt.annotation.NonNullByDefault
package bar;
annotations/java/lang/Object.eea
class java/lang/Object
getClass
()Ljava/lang/Class<*>;
()L1java/lang/Class<*>;
.settings/org.eclipse.jdt.core.prefs(部分)
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=enabled
org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=warning
org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
...
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
...
org.eclipse.jdt.core.compiler.compliance=1.8
...
org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=enabled
...
org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
org.eclipse.jdt.core.compiler.problem.nullReference=error
org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
...
org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
...
org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
...
org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=enabled
...
org.eclipse.jdt.core.compiler.source=1.8
.classpath
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="annotationpath" value="/null-annotation-test/annotations"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="org.eclipse.jdt.annotation_2.0.100.v20150311-1658.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
对于上述项目,我在 Foo.java 的第 10 行(调用 printType
的地方)收到以下警告:
Null type safety (type annotations): The expression of type 'Class<capture#of ? extends Foo>' needs unchecked conversion to conform to '@NonNull Class<?>'
这与我在没有外部空注释的情况下收到的警告相同。
如何为 java.lang.Object#getClass()
正确创建外部空注释以移除此警告?还是我的问题在 printType
?
Louis Wasserman 是正确的,在类型检查方面没有 one getClass()
方法,但是每个 class 都有自己的方法和专门的签名.因此,.eea 文件中的签名永远不会匹配实际的 getClass() 方法。
我提交了一个 RFE 将更多关于 getClass()
的特殊知识放入编译器,这样这个野兽就不需要外部注释了。
编辑:此功能已实现并将随 Eclipse 4.6 (Neon) 一起发布。