【发布时间】:2020-07-22 14:41:31
【问题描述】:
假设我有这样的 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) 操作“Assign statement to new local variable”时打电话,我收到了:
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!)
【问题讨论】:
-
我无法在 Eclipse 2020-06 中使用
org.jetbrains.annotations-1.5.0.jar以及 “使用内容辅助从中创建局部变量”的不同方式来重现此问题(你是用哪种方式拿?请说出你按了哪些键)。 -
我不知道那是什么叉子,但我使用的是the official distribution
org.jetbrains:annotations:19.0.0。反正@Target的元素类型是一样的,那么让我们看看如何复现吧。 -
@howlger 这似乎与Eclipse 在
.settings/org.eclipse.jdt.core.prefs中默认为org.eclipse.jdt.core.compiler.compliance=1.5有关,以防尚不支持哪种类型的注释,因此快速修复操作无法以这种方式工作。只要合规性升级到 8 或更高,我就可以在原版项目中再次重现它。作为记录,我在带有 Eclipse 2020-06 的 Windows 上使用Ctrl+1。抱歉,我应该称之为快速修复,而不是内容辅助 -
不幸的是,这仍然无法重现,
annotations-19.0.0.jar和 Java 8 或 Java 11 在普通(非 Maven)Java 项目中都无法重现。请在 Eclipse 2020-06 的新工作区中显示一个可用于在新的纯 Java 项目中重现此内容的可编译类(而不是单行代码)。 -
感谢您报告错误。但在我看来,这似乎是项目的错误配置而不是错误(请参阅下面的答案)。
标签: java eclipse annotations