问题 Java 8,Type Annotations和JSR 308


我安装了最后一个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)。看看下面的评论! 

我也不明白是否注释如下: NonNullInterned等等 插入JDK或者我们必须下载 检查框架


5742
2017-11-25 15:56


起源

检查那些注释是否可以应用于这些位置。检查 @Target 注解。 - Sotirios Delimanolis
你确定你是 运用 Java 8编译器,并且您将源级别设置为Java 8?因为你所说的与Oracle Java Tutorial关于Java 8的内容完全矛盾;看到 docs.oracle.com/javase/tutorial/java/annotations/basics.html - Stephen C
@Sotirios Delimanolis,好吧它适用于我的注释界面。也许我正在混乱使用NonNull,Interned等...... JDK中没有...它似乎明白使用类型注释就足以使用@Target(ElementType.TYPE_USE)了! - xdevel2000
@StephenC,是的我正在使用Java 8编译器。我的错误是不使用@Target(ElementType.TYPE_USE)。现在它有效。 - xdevel2000
你应该花点时间回答你自己的问题...并接受它。 - Stephen C


答案:


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

第二部分:

我也不明白是否注释如下: NonNullInterned等等将插入JDK或者我们必须下载Checker Framework。

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

理想情况下你应该 明确 源代码和/或字节码文件,从规范的地方获得。但是,如果要重现注释的源代码(包名称,注释名称,字段名称和类型)的显着部分并对其进行编译,那么JVM的其余部分将更加明智。

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

您询问是否将检查器注释添加到Java 8库中。我个人对此表示怀疑,因为这些注释的包名称是不可接受的。但是拭目以待......


6
2017-11-26 10:32





第二部分:

我也不明白是否注释如下:NonNull,Interned,   将插入JDK或者我们必须下载Checker   框架。

Oracle分布式JDK不包含@NonNull和@Interned等注释 - 既不定义它们,也不会在JDK方法上出现它们。

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


5
2017-09-30 12:56