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

Probable bugs
@NotNull/@Nullable problems
Not annotated method overrides method annotated with @RecentlyNonNull

对于以下代码
@Override
public String toString() {
    return title;
}

java - 什么是@RecentlyNonNull注释?-LMLPHP

我以前看过@NonNull批注,这意味着返回值永远不能为null。但是@RecentlyNonNull是什么?什么时候使用?

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

没有提供任何解释。

Lint 推荐是在其中添加该注释,但是它有什么作用?

java - 什么是@RecentlyNonNull注释?-LMLPHP

最佳答案

TL-DR
@RecentlyNonNull视为@NonNull约束,并在您的代码中以同样的方式对其进行尊重,因为@RecentlyNonNull属于@NonNull约束。

这意味着在实际问题中,OP应使用@NonNull注释覆盖的方法,以使其与父类(super class)中定义的@NonNull(在构建时转换为@RecentlyNonNull)兼容。
@RecentlyNonNull批注不属于SDK javadoc API的一部分。
之所以是not present in the support subpackage,是因为并非旨在存在于源代码中。相反,它是在构建时计算的,如果存根源文件中的@NonNull被认为是“最近的”,则将其替换。

由于这是内部处理,因此我对您的问题没有一个简单而直接的答案,但是我可能会给您一些指导,以更好地理解此注释及其来源。

1)@RecentlyNonNull或@RecentlyNullable:仅在存根源文件中生成的注释。

在Android中,生成的存根文件和生成的文档存根不会带来相同级别的信息:@RecentlyNonNull@RecentlyNullable可能会出现在存根文件中,而不会出现在仅粘贴到存根文件中的文档存根中。

您可以在 Options 类源代码中找到该信息:

“$ ARG_DOC_STUBS”,“为API生成文档存根源文件。文档存根” +
“文件与常规存根文件相似,但有一些区别。例如,在“+
“存根文件,我们将使用@RecentlyNonNull之类的特殊注释,而不是@NonNull来注释“+
“表示一个元素最近被标记为非null,而在文档存根中,我们将+
“只要将此列为@NonNull ...


googlesource document确认:



2)为代码棉签和IDE警告/错误引入了注释。

根据此blog,这些注释源自Kotlin支持,并允许编译器/linter根据非null约束的最新程度来应用非null违例的严重性级别(最近:警告编译,不是最近:错误编译) :

07-26 02:47