2

我以为我会尝试一下检查器框架,但我得到了很多

/Users/calebcushing/IdeaProjects/ppm/scaf/src/main/java/com/xenoterracide/scaf/Config.java:22: warning: [type.anno.before.modifier] write type annotation @NonNull() immediately before type, after modifiers [abstract]
  abstract Map<String, SkeletonConfiguration> getTemplates();

对于此代码

  @Nullable
  abstract String getWorkdir();

这似乎是我应该写的建议

  abstract @Nullable String getWorkdir();

但这违背了 JLS,有没有办法禁用它?

4

2 回答 2

4
  1. 您说,“这违反了 JLS”,但事实并非如此。它是合法的 Java,而且风格更好。

  2. Checker Framework Manual描述了如何抑制警告,例如通过@SuppressWarning("type.anno.before.modifier")注释或-AsuppressWarnings=type.anno.before.modifier命令行参数。

于 2020-12-09T17:09:05.713 回答
0

但这违背了 JLS

纯粹为这个陈述回答:检查器正在实现JLS 9.7.4中描述的内容:

尽管不是必需的,但习惯上在所有其他修饰符之前编写声明注释,并在它们应用的类型之前立即编写类型注释。

Checker's 的 JavadocNullable所示:

Nullable是一个类型注解

因此它应该出现在它所应用的类型之前,即方法的返回类型。


您还在评论中链接了JLS 8.4.3。这显示了语法产生MethodModifier

MethodModifier:
    (one of)
    Annotation public protected private
    abstract static final synchronized native strictfp

这没有直接关系:一方面,它说你只能使用这些修饰符之一,所以它不能告诉你任何关于排序的信息。但是,如果您检查JLS 19,您可以找到MethodModifier出现的上下文:

MethodDeclaration:
    {MethodModifier} MethodHeader MethodBody

MethodModifier:
    (one of)
    Annotation public protected private
    abstract static final synchronized native strictfp

MethodHeader:
    Result MethodDeclarator [Throws]
    TypeParameters {Annotation} Result MethodDeclarator [Throws]

因此,检查器告诉您按照MethodHeader生产中的指定放置注释。

于 2020-12-10T11:42:24.033 回答