TL-DR
考虑@RecentlyNonNull
as a @NonNull
约束并在代码中以相同的方式尊重它,因为@RecentlyNonNull
是在引擎盖下@NonNull
约束。
这意味着在实际问题中,OP应该用以下注释来注释被重写的方法@NonNull
符合@NonNull
(在构建时转换为@RecentlyNonNull
) 在超类中定义。
The @RecentlyNonNull
注释不构成 SDK javadoc API 的一部分。
It is 不存在于support分包 https://developer.android.com/reference/android/support/classes因为它不是设计为出现在源代码中的。相反,这是在构建时计算并替换@NonNull
如果它在存根源文件中被视为“最近”。
由于这是一个内部处理,我对你的问题没有一个简单直接的答案,但我可以给你一些指导,以更好地理解这个注释及其起源。
1) @RecentlyNonNull 或 @RecentlyNullable :仅在存根源文件中生成的注释。
在 Android 中,生成的存根文件和生成的文档存根不会带来相同级别的信息:@RecentlyNonNull
or @RecentlyNullable
可能出现在存根文件中,但绝不会出现在仅保留存根文件的文档存根中。
您可以在以下位置找到信息Options https://android.googlesource.com/platform/tools/metalava/+/master/src/main/java/com/android/tools/metalava/Options.kt类源代码:
"$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...
This 谷歌源文档 https://android.googlesource.com/platform/tools/metalava/+/master/stub-annotations/确认:
这里有一些注释不在支持库中,
例如@RecentlyNullable
and @RecentlyNonNull
。这些都是用的
仅在存根中自动将代码标记为最近注释的
与空/非空。我们不希望源代码中出现这些注释
代码;最近性是在构建时计算并注入到
存根代替普通的空注释。
2) 为代码检查和 IDE 警告/错误引入注释。
根据这个blog https://android-developers.googleblog.com/2018/08/android-pie-sdk-is-now-more-kotlin.html这些注释源自 Kotlin 支持,并允许编译器/linter 根据非空约束的最新程度应用非空违规的严重级别(最近:警告编译,而不是最近:错误编译):
通常,Kotlin 中的可空性合约违规会导致
编译错误。但为了确保新注释的 API
与您现有的代码兼容,我们正在使用内部机制
由 Kotlin 编译器团队提供,用于将 API 标记为最近
已注释。最近注释的 API 只会产生警告
而不是来自 Kotlin 编译器的错误。您将需要使用
Kotlin 1.2.60 或更高版本。
我们的计划是让新添加的可空性注释产生
仅警告,并将严重性级别增加到从以下开始的错误
次年的Android SDK。目标是为您提供
有足够的时间来更新您的代码。