什么是@RecentlyNonNull注释?

时间:2018-10-30 07:04:21

标签: java android

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

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

针对以下代码

@Override
public String toString() {
    return title;
}

enter image description here

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

Google搜索使我进入https://android.googlesource.com/platform/tools/metalava/+/fcb3d99ad3fe17a266d066b28ceb6c526f7aa415/stub-annotations/src/main/java/android/support/annotation/RecentlyNonNull.java

,不提供任何解释。

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

enter image description here

1 个答案:

答案 0 :(得分:9)

对于您的问题,我没有一个简单直接的答案,但我可能会给您一些指导。
请注意,the support subpackage的SDK javadoc中没有此注释。

1)就生成的Javadoc而言,此存根注释意味着NonNull是最近添加的。

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

"$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 document中:

  

这里有些注释不在支持库中,   例如@RecentlyNullable@RecentlyNonNull。这些被使用   仅在存根中自动将代码标记为最近注释   具有null / non-null。我们不希望这些注释出现在源代码中   码;最近度是在构建时计算的,并注入到   存根代替常规的空注释。

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

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

  

通常,在Kotlin中违反可废止合同的行为会导致   编译错误。但是要确保新注释的API是   与您现有的代码兼容,我们正在使用一种内部机制   由Kotlin编译器团队提供,用于将API标记为最新   带注释的。最近注释的API仅会导致警告   而不是Kotlin编译器的错误。您将需要使用   Kotlin 1.2.60或更高版本。

     

我们的计划是产生新添加的可空性注释   仅警告,并将严重性级别提高到错误始于   次年的Android SDK。目标是为您提供   有足够的时间来更新您的代码。