Java 如何在将表达式分配给局部变量时防止Eclipse生成类型注释

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代码:

封装测试;
导入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
    注释