【问题标题】:Java 8, Type Annotations and JSR 308Java 8、类型注释和 JSR 308
【发布时间】:2013-11-25 15:56:54
【问题描述】:

我已经安装了最后一个 JDK 8 (b116),但我注意到我不能使用类型注释。 例如阅读 Java 教程,如果我写的话:

String str = null;
String myString = (@NonNull String) str;

TEST st = new @Interned TEST();

编译器给我以下错误:

annotation type not applicable to this kind of declaration

现在可以了。在使用类型注解之前,我们必须对注解进行注解 与@Target(ElementType.TYPE_USE)。看看下面的cmets!

我也不明白像NonNullInterned等这样的注解会不会 插入JDK或者如果我们必须下载Checker Framework

【问题讨论】:

  • 检查这些注释是否可以应用于这些位置。检查@Target 注释。
  • 您确定您正在使用 Java 8 编译器,并且您已将源代码级别设置为Java 8?因为您所说的与 Oracle Java 教程中关于 Java 8 的说法直接矛盾;见docs.oracle.com/javase/tutorial/java/annotations/basics.html
  • @Sotirios Delimanolis,好的,它适用于我的注释界面。也许我把 NonNull、Interned 等弄得一团糟...... JDK 不存在这些......似乎明白使用类型注释足以使用 @Target(ElementType.TYPE_USE)!跨度>
  • @StephenC,是的,我正在使用 Java 8 编译器。我的错误是不使用@Target(ElementType.TYPE_USE)。现在可以了。
  • 你应该花一点时间来回答你自己的问题......并接受它。

标签: java annotations


【解决方案1】:

您自己已经回答了问题的第一部分。

第二部分:

我也不明白像NonNullInterned等这样的注解是否会被插入到JDK中,或者我们是否必须下载Checker Framework。

注解只是一种Java类/接口。它们必须在源代码中定义并编译。

理想情况下,您应该从规范的地方获得权威源代码和/或字节码文件。但是,如果您要重现注解源代码的重要部分(包名称、注解名称、字段名称和类型)并对其进行编译,那么 JVM 的其余部分就不会更明智了。

但是当您谈论特定的注解,如@NonNull@Interned 时,您需要意识到在不同的包中可能存在这些注解的多个版本。在标准/事实上的标准版本出现之前,这可能会导致问题(对于注释处理软件)。我不知道 Checkers 框架是否可以被称为事实上的标准......。

您询问是否将检查器注释添加到 Java 8 库中。我个人对此表示怀疑,因为这些注释的包名是不可接受的。不过等着瞧吧……

【讨论】:

    【解决方案2】:

    第二部分:

    我也不明白这些注释是否像:NonNull、Interned、 等将被插入 JDK 或者如果我们必须下载 Checker 框架。

    Oracle 分发的 JDK 不包含像 @NonNull 和 @Interned 这样的注解——既没有定义它们,也没有出现在 JDK 方法中。

    但是,Checker Framework 包含注释版本的 JDK,如 Checker Framework manual 中所述。 Checker Framework 让您可以在运行时甚至编​​译时使用库的最终版本,而可插入的类型检查会看到注释,因此类型检查结果会更加精确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 2013-08-06
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多