什么是@RecentlyNonNull注释?

Ang*_*Koh 22 java android

我正在Android Studio上进行代码检查,弹出以下警告

Probable bugs
@NotNull/@Nullable problems 
Not annotated method overrides method annotated with @RecentlyNonNull
Run Code Online (Sandbox Code Playgroud)

对于以下代码

@Override
public String toString() {
    return title;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我之前看过@NonNull注释,这意味着返回永远不能为空.但是什么是@RecentlyNonNull?我什么时候使用它?

谷歌搜索引导我到https://android.googlesource.com/platform/tools/metalava/+/fcb3d99ad3fe17a266d066b28ceb6c526f7aa415/stub-annotations/src/main/java/android/support/annotation/RecentlyNonNull.java

这没有提供任何解释.

lint recomendation是添加该注释,但它做了什么?

在此输入图像描述

dav*_*xxx 19

我对你的问题没有一个简单而直接的答案,但我可能会给你一些指示.
请注意,这个注释是不存在的SDK的javadoc @RecentlyNonNull分装.

1)就生成的Javadoc而言,此存根注释意味着@NonNull最近添加了该注释.

您可以在@RecentlyNonNull类源代码中找到相关信息:

"$ARG_DOC_STUBS ", "Generate documentation stub source files for the API. Documentation stub " +
                "files are similar to regular stub files, but there are some differences. For example, in " +
                "the stub files, we'll use special annotations like @RecentlyNonNull instead of @NonNull to " +
                "indicate that an element is recently marked as non null, whereas in the documentation stubs we'll " +
                "just list this as @NonNull...

在这个googlesource文档中:

这里有一些注释不在支持库中,例如@NonNull@NonNull.这些仅在存根中用于自动标记最近使用null/non-null注释的代码.我们不希望在源代码中使用这些注释; 最近的ness在构建时计算并注入到存根中以代替正常的空注释.

但它似乎也可能在IDE警告/错误中使用.

2)根据这个博客,这个约束起源于Kotlin支持,并允许编译器/ linter根据非null约束的最近值来应用非null违规的严重性级别(最近:警告编译,而不是最近:错误汇编):

通常,Kotlin中的可空性合同违规会导致编译错误.但是为了确保新注释的API与您现有的代码兼容,我们使用Kotlin编译器团队提供的内部机制来标记最近注释的API.最近注释的API只会产生警告而不是来自Kotlin编译器的错误.您需要使用Kotlin 1.2.60或更高版本.

我们的计划是让新添加的可空性注释仅生成警告,并将严重性级别提高到下一年的Android SDK中的错误.目标是为您提供足够的时间来更新代码.

  • 您应该考虑注释的参数、字段或方法返回值被设计为不为空,类似于`@NonNull`目的(/sf/ask/2492331971/),但不同之处该限制是“最近”添加的。所以短绒可能会更宽松(虽然你可以改变它) (3认同)
  • 那么我应该将RecentlyNonNull 视为可以为空的东西,还是不能为空的东西? (2认同)
  • 你确实应该。 (2认同)