Java 如何在将表达式分配给局部变量时防止Eclipse生成类型注释
假设我有如下Java代码:Java 如何在将表达式分配给局部变量时防止Eclipse生成类型注释,java,eclipse,annotations,Java,Eclipse,Annotations,假设我有如下Java代码: 封装测试; 导入java.lang.annotation.ElementType; 导入java.lang.annotation.Target; 公开课考试{ @NotNull 公共静态对象(){ 返回新对象(); } 公共静态无效测试(){ 对象(); } } @目标({ElementType.METHOD,ElementType.TYPE_USE}) @接口NotNull{} 当我在“object();”调用中使用快速修复(Ctrl+1)操作“将语句分配给新的局
封装测试;
导入java.lang.annotation.ElementType;
导入java.lang.annotation.Target;
公开课考试{
@NotNull
公共静态对象(){
返回新对象();
}
公共静态无效测试(){
对象();
}
}
@目标({ElementType.METHOD,ElementType.TYPE_USE})
@接口NotNull{}
当我在“object();”调用中使用快速修复(Ctrl+1)操作“将语句分配给新的局部变量”时,我得到以下结果:
公共静态无效测试(){
@NotNull
Object=Object();
}
我不想在我的客户机Java代码中使用注释,因为它对我来说只是噪音。我怎样才能防止它一直被生成,并得到它呢
公共静态无效测试(){
Object=Object();
}
所有这些仅在注释具有@Target(TYPE_USE)
时发生,并且仅当org.eclipse.jdt.core.compiler.compliance=8
或更高版本的.settings/org.eclipse.jdt.core.prefs
为了记录在案,我也提交了
(现实世界的API正在声明此类注释,以实现更好的Kotlin互操作性(使用JetBrains注释),因为Kotlin可以使用它来区分
T
和T?
,并避免T!
)在您的情况下不需要的@NotNull
,当且仅当基于注释的空分析未启用或配置错误时才会添加
在项目>属性:Java>编译器的空分析部分中:
test.NotNull
(或org.jetbrains.annotations.NotNull
)作为“非空”注释,而不是选中复选框为空规范使用默认注释元素类型。类型\u USE
注释。对于使用ElementType.TYPE\u注释的方法(不能添加到void
方法),注释指的是返回类型,而不是方法本身。换句话说,当调用这样的方法时,您会得到一个带注释的对象。对我来说,将类型注释的使用添加到变量的类型是预期的行为
对于注释,例如在您的案例中,同时具有两个目标,ElementType.TYPE\u使用和ElementType.METHOD
,它只会变得不清晰。注释引用的是返回类型(因此添加它是有意义的),还是方法引用的是方法本身(因此不应该添加)
与org.jetbrains.annotations.NotNull
org.eclipse.jdt.annotation相比,也请不要这样做。NonNull
没有目标ElementType.METHOD
。方法声明如何可以null
?@NotNull
方法的含义是什么?根据(“…null值禁止返回(对于方法)…”),目标ElementType.METHOD
似乎是错误地添加到这里的,因为它没有引用为了实现更好的Kotlin互操作性,例如
接口结果查询{
@NotNull Result fetch();
@可为空的R fetchOne();
}
在jOOQ的情况下,对注释的依赖可以在Maven中设置为可选/提供,或者在JPMS中设置为static
,这样普通Java客户端代码默认情况下就看不到注释:
org.jetbrains
注释
假如
真的
Kotlin编译器仍然可以看到它:
valq:ResultQuery=。。。
q、 fetch()//结果
q、 fetchOne()//R?
如果您无法控制的第三方正在引入依赖项,则可以按如下方式排除该依赖项:
org.testcontainers
测试容器
org.jetbrains
注释
在Eclipse 2020-06中,我无法使用“使用内容辅助从中创建局部变量”的不同方式(您采用了哪种方式?请告诉我您按了哪些键)来重现这一点。我不知道那是什么叉,但我使用的是。无论如何,@Target
元素类型是相同的,所以让我们看看如何复制它。@howlger这似乎与Eclipse在.settings/org.Eclipse.jdt.core.compiler.compliance=1.5
中默认设置为org.Eclipse.jdt.core.prefs
有关,在这种情况下,还不支持类型注释,因此,快速修复行动不能以这种方式工作。一旦compliance升级到8或更多,我就可以在一个普通项目中再次复制它。作为记录,我在带有Eclipse2020-06的Windows上使用了Ctrl+1
。抱歉,我应该称之为快速修复,而不是内容修复,幸运的是,这仍然是不可复制的,不适用于annotations-19.0.0.jar
,也不适用于普通(非Maven)Java项目中的Java 8或Java 11。请显示一个可编译类(而不是一行代码),该类可用于在Eclipse 2020-06的新工作区中的新普通Java项目中重现此错误。感谢您报告此错误。但在我看来,这似乎是对项目的一个错误配置,而不是一个bug(见下面我的答案)。非常感谢您的解释。我认为这对于堆栈溢出问题来说已经足够好了,因此未来的访问者可以在需要时使用它来应用解决方法。这是否是需要的,可以在bug中进一步讨论:可选的Maven依赖项阻止org.jetbrains
注释