考虑将
@RecentlyNonNull
视为
@NonNull
约束,并在代码中以相同的方式尊重它,因为
@RecentlyNonNull
本质上是一个
@NonNull
约束。这意味着在实际问题中,OP应该使用
@NonNull
注释覆盖的方法,以符合在超类中定义的
@NonNull
(在构建时转换为
@RecentlyNonNull
)。
@RecentlyNonNull
注释不属于SDK javadoc API的一部分。
它不在support
子包中,因为它不是设计成出现在源代码中的。相反,它在构建时计算并替换@NonNull
,如果在存根源文件中被认为是“最近的”。
由于这是内部处理,我没有简单明了的答案,但我可以给你一些指针来更好地理解这个注释及其起源。
1)@RecentlyNonNull或@RecentlyNullable:只在存根源文件中生成的注释。
在Android中,生成的存根文件和生成的文档存根没有带来相同级别的信息:@RecentlyNonNull
或@RecentlyNullable
可能出现在存根文件中,但从不出现在仅依赖存根文件的文档存根中。
您可以在Options
类源代码中找到这些信息:
"$ARG_DOC_STUBS ", "为API生成文档存根源文件。文档存根文件类似于常规存根文件,但有一些区别。例如,在存根文件中,我们将使用特殊注释(如@RecentlyNonNull)而不是@NonNull来指示元素最近被标记为非null,而在文档存根中,我们将仅列出此项作为@NonNull...。
这个
googlesource document证实了这一点:
引用:
这里有一些注释不在支持库中,比如@RecentlyNullable和@RecentlyNonNull。这些仅用于存根,自动标记代码为最近注释的空/非空。我们不希望这些注释出现在源代码中;最近性是在构建时计算并注入到存根中代替正常的空注释。
2)为代码linter和IDE警告/错误引入的注释。
根据这个
blog,这些注释起源于Kotlin支持,并允许编译器/ linter根据非null约束的最近程度应用严重性级别(最近:警告编译,不是最近:错误编译)。
通常,在Kotlin中,nullability合约违规会导致编译错误。但是为了确保新注释的API与您现有的代码兼容,我们正在使用由Kotlin编译器团队提供的内部机制将API标记为最近注释过的。最近注释过的API仅会从Kotlin编译器产生警告而不是错误。您需要使用Kotlin 1.2.60或更高版本。
我们的计划是仅在新添加的nullability注释中产生警告,并在以下年度的Android SDK中将其严重级别提高到错误。目标是为您提供充足的时间来更新您的代码。