假设我有这样的 Java 代码:
package test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
public class Test {
@NotNull
public static Object object() {
return new Object();
}
public static void test() {
object();
}
}
@Target({ ElementType.METHOD, ElementType.TYPE_USE })
@interface NotNull {}
当我在“object();”上使用快速修复 (Ctrl+1) 操作“将语句分配给新的局部变量”时打电话,我收到这个:
public static void test() {
@NotNull
Object object = object();
}
我不想在我的客户端 Java 代码中使用注释,因为它对我来说只是噪音。我怎样才能防止它一直生成,并得到它呢?
public static void test() {
Object object = object();
}
所有这些仅在注释具有 @Target(TYPE_USE)
时才会发生,并且仅在 org.eclipse.jdt.core.compiler.compliance=8
或更高版本时发生在 .settings/org.eclipse.jdt.core.prefs
作为记录,我还提交了 enhancement request 565463 .
(现实世界的 API 声明此类注释是为了更好的 Kotlin 互操作性(使用 JetBrains 注释),因为 Kotlin 可以使用它来区分 T
和 T?
,并避免 T!
)
最佳答案
@NotNull
,当且仅当未启用或配置错误基于注释的空分析时,才会添加您不需要的内容。
在项目 > 属性:Java > 编译器中的空分析部分:
- 确保选中启用基于注释的空分析复选框
- 不要选中对空规范使用默认注释复选框,而是单击配置...链接并配置
test.NotNull
(或org.jetbrains.annotations.NotNull
)作为'NonNull'注释
请注意,仅 ElementType.TYPE_USE
将添加注释。对于用ElementType.TYPE_USE
注释的方法注解(不能添加到 void
方法中),注解指的是返回类型,而不是方法本身。换句话说,调用此类方法时您会获得一个带注释的对象。对我来说,向变量的类型添加使用类型注释是预期的行为。
只有对于像您的情况那样具有两个目标 ElementType.TYPE_USE
的注释,它才会变得不清楚。和ElementType.METHOD
。注释是否引用返回类型(因此添加它是有意义的)还是方法引用方法本身(因此不应添加它)?
也请不要与 org.jetbrains.annotations.NotNull
形成对比org.eclipse.jdt.annotation.NonNull
没有目标ElementType.METHOD
。方法声明怎么可以是 null
? @NotNull
是什么意思方法?根据Javadoc of org.jetbrains.annotations.NotNull
(“...禁止返回空值(对于方法)...”),目标 ElementType.METHOD
似乎是在这里错误添加的,因为它没有引用 method declaration .
关于java - 如何防止 Eclipse 在将表达式分配给局部变量时生成类型注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63036897/