我正在Android Studio上进行代码检查,并弹出以下警告
Probable bugs
@NotNull/@Nullable problems
Not annotated method overrides method annotated with @RecentlyNonNull
对于以下代码
@Override
public String toString() {
return title;
}
我以前看过@NonNull批注,这意味着返回值永远不能为null。但是@RecentlyNonNull是什么?什么时候使用?
谷歌搜索将我引到https://android.googlesource.com/platform/tools/metalava/+/fcb3d99ad3fe17a266d066b28ceb6c526f7aa415/stub-annotations/src/main/java/android/support/annotation/RecentlyNonNull.java
没有提供任何解释。
Lint 推荐是在其中添加该注释,但是它有什么作用?
最佳答案
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违例的严重性级别(最近:警告编译,不是最近:错误编译) :