什么是 @RecentlyNonNull 注释?

2024-03-20

我正在 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 https://android.googlesource.com/platform/tools/metalava/+/fcb3d99ad3fe17a266d066b28ceb6c526f7aa415/stub-annotations/src/main/java/android/support/annotation/RecentlyNonNull.java

其中没有提供任何解释。

lint 建议添加该注释,但它有什么作用呢?


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。目标是为您提供 有足够的时间来更新您的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是 @RecentlyNonNull 注释? 的相关文章

  • Poi:从 xlsm 打开 Excel 文件后将其保存为 xlsx

    我正在编写一个java程序 它打开一个用户定义的excel文件 用数据填充它 然后将其保存在用户指定的路径 文件名和扩展名下 即使输入文件是 xlsm 也应该可以声明输出保存为 xlsx 但实际上是不可能的 如果我尝试使用下面的代码 打开文
  • 更新到Android 5.0后出现java.lang.UnsatisfiedLinkError

    我正在开发一个 Android 应用程序 它使用一个名为 liballjoyn java so 的本机库 可用here https allseenalliance org developers download在 Android 核心 SD
  • 如何使用jdbc驱动编写事务?

    我想使用 jdbc 编写一个事务java 我尝试过这个简单的交易 BEGIN TRANSACTION NL GO NL UPDATE table SET col test where id 1010 NL GO NL COMMIT 我尝试过
  • 如何使用 Android Volley API?

    我正在考虑在我的下一个项目中实现 Android Volley 库 关于 Volley 的 Google IO 演示 http www youtube com watch v yhv8l9F44qo 但是 我还没有找到该库的任何重要的 AP
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • 如何使 JFileChooser 仅显示具有某些特定名称 Java 的文件夹

    有什么方法可以让 JFileChooser 加载时仅显示名称为 Hello 的文件夹 这是我的代码 它显示所有文件夹以及扩展名为 py 和 java 的文件 我想添加文件夹名称限制 FileNameExtensionFilter filte
  • 使用 Jboss7 加载资源返回 null

    如何使用Jboss7 1从java代码中加载图像等资源 这曾经与 Jboss4 一起使用 this getClass getClassLoader getResourceAsStream myapp includes images imag
  • ConstraintLayout 源代码位于哪里?

    哪里可以找到android的源代码ConstraintLayout 我在支持框架存储库甚至谷歌搜索中都找不到它 它的源代码在这里 https android googlesource com platform frameworks opt
  • 使用 Espresso + MockK 进行 Android UI 测试时,在模拟器上使用 SIGSEGV 会崩溃,在物理设备上则正常

    我刚刚开始使用MockK模拟基于 MVP 的应用程序中的所有存储库 服务逻辑以进行 UI 测试 我有一些运行登录活动的 UI 测试 其中 Espresso 输入登录名和密码 并使用 MockK 我可以fake登录失败或无法登录的各种情况 所
  • 为什么这段代码可以在 Java 7 中运行,而不能在 Java 8 中运行?

    我目前使用 IDE Eclipse 版本 Neon 2 Release 4 6 2 和版本 java Version 8 Update 131 在此代码中 IDE 给出错误 类型不匹配 无法从字节转换为整数 Integer i byte 1
  • 我有什么理由应该嘲笑?

    我也是 Mockito 和 PowerMockito 的新手 我发现我无法使用纯 Mockito 测试静态方法 因此我需要使用 PowerMockito 对吗 我有一个非常简单的类 名为 Validate 使用这个非常简单的方法 publi
  • 抛出 UnsupportedOperationException

    因此其中一种方法的描述如下 public BasicLinkedList addToFront T data 该操作无效 对于排序列表 将生成 UnsupportedOperationException 使用消息 排序列表的操作无效 我的代
  • MediaPlayer() 音频口吃(android)

    我正在我的 Android 应用程序中使用 MediaPlayer 函数从远程服务器传输实时音频流 但音频断断续续且断断续续 问题不在于我的互联网 因为当我在计算机上播放时 提要播放得很好 可能是什么问题 注意 直播正在进行中 这是我正在使
  • 如何将 .txt 文件的最后 5 行读入 java

    我有一个包含多个条目的文本文件 例如 hello there my name is JoeBloggs 我如何按降序阅读最后五个条目 即来自 JoeBloggs 那里 我目前有代码只能读取最后一行 public class TestLast
  • 使用mapstruct映射不同类型列表的元素

    我们正在映射一个对象 该对象具有一个对象列表 这些对象都实现了父接口 但可能具有不同的实现 但当我们映射列表时 似乎只有来自 ParentClass 的值被映射 而不是来自子类的值 但直接映射子进程就可以了 public class Par
  • 在Java中,为什么某些变量首先需要初始化,而其他变量只需要声明?

    我试图更深入地理解我是否遗漏了一些关于 Java 何时需要变量初始化与简单声明的理解 在以下代码中 不需要为变量 row 赋值即可编译和运行 但变量 column 则需要赋值 注意 该程序没有任何用处 它已被修剪为仅显示此问题所需的内容 以
  • Firebase 附加权限。是否要求用户接受

    我目前正在致力于将 Firebase Analytics 集成到我的 Android 应用程序中 我遇到的问题是 Firebase 添加了一些新权限 这些权限是 permission WAKE LOCK com google android
  • eclipse.ui.menus 的名称过滤器

    我有一个菜单贡献 通过实现org eclipse ui menus扩展点 我想仅为特定文件扩展名 例如 pld 提供此菜单贡献 但我不知道如何使用 visibleWhen 来做到这一点 有任何想法吗 更新 到目前为止我的扩展点
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然
  • 当应用程序在 Android 中首次启动时,仅显示一次消息对话框

    我在android中开发了一个应用程序 其中一个重要的要求是仅在应用程序第一次运行时显示语言支持的消息对话框 然后每次用户再次运行应用程序时它都会消失 我 我尝试过使用共享首选项 但没有成功 还有其他方法吗 在 onCreate 处理程序中

随机推荐

  • Xamarin Android 文件系统路径

    我正在尝试在 Android 文件系统上写入和读取文件 您认为这项任务很简单 但我似乎无法为实际存在的文件夹 路径找到正确的枚举器 我读过关于同一主题的几篇文章 但他们都没有给出这个问题的直接答案 而那些似乎已经解决了问题的人 却采用了似乎
  • Python dict 具有基于键的默认值

    我需要一个字典 它会自动填充每个缺失的访问键的默认值 我发现了defaultdict以及其他一些方法来实现此目的 但我的情况的问题是我希望每个键的默认值特定于该键本身 例如 与defaultdict我可以实现这样的目标 from colle
  • WPF 矩形填充水平或垂直线

    我正在尝试创建一个充满水平线或垂直线的矩形 矩形的宽度是动态的 因此我无法使用图像画笔 如果有人知道任何解决方案 请告诉我 我想出了一个直接的方法来做到这一点 最后 我使用以下视觉画笔资源分别用水平 垂直或垂直虚线填充矩形
  • VC++ 中的异常错误 c0000005

    正在开发 VC 控制台应用程序 此应用程序从 Appdata Roaming 文件夹发送文件一段时间 发生的情况是出现此崩溃错误 Problem signature Problem Event Name APPCRASH Applicati
  • 我是否必须在 iOS 的 Objective-C 中保留块?

    我想创建一个方法 它接受一个块 将其保存在成员中 启动异步任务 然后在异步调用进行完成回调时调用该块 我必须保留该块吗 块内存的管理方式是否与任何其他对象相同 我可以合成一个属性来持有该方块吗 块与内存管理的其他对象类似 但又不相同 当创建
  • Xamarin 强迫我下载 Android SDK 和 NDK

    我的计算机上安装了 Android SDK 和 NDK 在自定义位置 我正在尝试在 Windows 环境中安装 xamarin 但安装程序想要强制我安装 SDK 和 NDK 看起来无法通过安装文件夹找到 有没有解决方案可以指定何时安装我的
  • 如何以 json 格式(双引号)漂亮打印(人类可读的打印)Python 字典? [复制]

    这个问题在这里已经有答案了 这是一个后续问题this one https stackoverflow com questions 16087662 pprint how to use double quotes to display str
  • 错误:程序类型已存在:com.google.android.gms.internal.measurement.zzdz

    我看过关于这个主题的几篇类似的文章 但没有一个适用于我的情况 我根据这些帖子收集到 这可能是由我的 Firebase 依赖项之一引起的 但我不确定如何解决此问题 清理 失效等工作已经完成 我的所有依赖项都已更新到最新版本 这是我的 grad
  • NodeJS 响应当我直接从 MySQL 获取时 MySQL 时区不同

    当我直接请求MySQL时 我得到UTC日期 我在MySQL服务器中设置UTC 但是使用NodeJS我得到UTC 2本地时区数据 为什么 如何设置 NodeJS 获取 UTC 我在初始化mysql连接时在index js中添加了时区 var
  • Maya Python - 使用 UI 中的数据

    我正在开发一个脚本程序 并且在用户界面方面遇到了一些困难 我制作了几个用户界面 所有这些用户界面似乎都可以单独工作 但我不知道如何将用户界面中输入的数据使用到另一个函数 我正在尝试获取枪类型 由用户选择 Bullet Spray Gener
  • 使用 Revit API 进行编码:减少内存使用的技巧?

    我有一个非常 普遍 的问题 我正在使用 Revit API 使用 python 进行开发 有时我会观察到 Revit 会话在测试和试验期间变得更慢 Revit 保持打开状态的时间越长 这种情况似乎发生得越多 虽然还没有到真正有问题的地步 但
  • spring 将两个验证注释合二为一

    我在用着Spring Hibernate Spring MVC 我想定义一个结合其他两个预定义验证注释的自定义约束 NotNull Size像这样 import javax validation constraints NotNull im
  • 绝对值的 SUMIF

    我有一个电子表格 其值如下 A B 10 55 x 10 05 0 55 x 7 55 88 50 x 我想要所有行的绝对总和x in B 我可以得到 x 行的总和 SUMIF B2 B100 x A2 A100 以及所有 A 列的绝对总和
  • 无法构建 gem 本机扩展 — Rails 安装

    我一直根据 edX 在线课程的说明安装 Ruby on Rails 以下是终端命令的列表 以及相关的相应输出 sudo apt get install ruby1 9 1 安装成功 wget http production cf rubyg
  • Javascript:检查重复打开的窗口

    是否可以检查同一窗口是否已打开 例如我通过 javascript 打开了一个窗口 我可以通过javascript检查它是否在另一个页面上打开吗 只是想关注已打开的页面以避免重复窗口 谢谢 Look at window open 方法 您必须
  • python 中缺少 lxml 模块?

    我想用Python docx处理word文件的库 Adocx py参考lxml 正如我假设的那样 from lxml import etree 当我启动脚本时 出现错误 No module named lxml 这是标准库吗 那么为什么没有
  • 使用版本控制同步 sftp 文件系统

    我最近开始为一个大学社团管理一个 小型 网站 显然 根据最后一个管理它的人的说法 访问该网站文件的方式是通过 SFTP 我使用 Linux Mint Nautilus 所以这没有问题 不过 我还有一个本地副本 可以在上传之前使用 Apach
  • 如何比较两个字符串的值是否相等,最好的方法是什么? [复制]

    这个问题在这里已经有答案了 总是对这个东西很困惑 有人可以帮忙吗 string1 equals string2 就是这样 它返回true if string1等于string2在价值上 否则会返回false 等于参考 http downlo
  • 如何在Acumatica发票报表(AR.64.10.00)中进行金额字段的文字表示?

    如何在Acumatica发票报表 AR 64 10 00 中进行金额字段的文字表示 在 DAC 扩展中创建一个未绑定字段ARInvoice数模转换器 并使用PX Objects AP ToWords属性 public class ARInv
  • 什么是 @RecentlyNonNull 注释?

    我正在 Android Studio 上进行代码检查 弹出以下警告 Probable bugs NotNull Nullable problems Not annotated method overrides method annotate