【问题标题】:Pass null to non-nullable Java method from Kotlin从 Kotlin 将 null 传递给不可为 null 的 Java 方法
【发布时间】:2019-11-18 14:44:36
【问题描述】:

假设有一个声明为@NonNullApi 的Java 库,但它的某些方法实际上可能会消耗null 参数。

有没有办法忽略不可空性要求并从 Kotlin 那里传递null

UPD 需要澄清:方法被第三方库声明为不可为空,无法更改其代码。目标是打破调用方的限制。

明显的方法是使用反射,但也许 Kotlin 只提供了语法?

【问题讨论】:

  • @Nullable注释参数
  • 你的意思是参数声明吗?这是第 3 方库,无法更改。
  • 它是什么库?你想将 null 传递给什么方法?
  • 如果库中的 bug 导致此参数不可为空,那么您可以编写一个接受 null 并将其传递给库的 Java 方法,并从 Kotlin 调用此 Java 方法。跨度>

标签: java kotlin null


【解决方案1】:

一个明显的非回答:不要那样做!

该 API 文档说:不要以这种方式发送null

即使今天的实现并没有因为你传入null而责怪你,谁说这不是一个错误,并且它不会在一些即将发布的版本中得到修复那个图书馆?

换句话说:编写代码以匹配指定的 API。

当库实现比 API 规范更慷慨时,宁愿遵循更严格的规则。您甚至应该考虑为该库编写一份报告。

【讨论】:

    【解决方案2】:

    正如这里的另一个答案所指出的,最好不要克服用可空性注释表示的 Java 函数的可空性合同。

    但如果您真的认为这些注释存在 错误,您可以使用以下解决方法:

    • 在 Kotlin 代码旁边的实用 Java 类中声明一个辅助静态函数。此函数在您需要传递null 的那些参数上没有NonNull 注释,它只是将它们转发给相关方法。即使可空性注释不匹配,Java 编译器也不会阻止调用该方法。
    • 将该静态辅助函数导入 Kotlin 并从那里调用。

    【讨论】:

    • 谢谢!当然,这个 hack 不应该用于设计良好的 API。可惜这么简单的事情需要这么多代码。
    • @AlexeyAdamovskiy 好吧,...我认为这种方式(这么多代码)比另一种更好(对此有一个简单的修复)...图书馆设计师不想接受@ 987654323@-values 这里...该函数与null-values 一起使用可能只是巧合...如果这是一个错误并且应该接受null,那么您最好联系该库设计者...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2016-02-04
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多