【问题标题】:kotlin: wrong inference of nullability in function reference?kotlin:函数引用中可空性的错误推断?
【发布时间】:2018-09-15 21:35:36
【问题描述】:

我想为可空字符串选择一个验证函数:

val aString: String? = ...
val validation
       //  : KFunction1<CharSequence?, Boolean>
           = if (...) Objects::isNull else StringUtils::isNotBlank

isNotBlank 来自 apache commons。它接受字符串并返回布尔值。

当我取消显式类型声明的注释时,一切都很好。但是当没有显式声明类型时,它会推断KFunction1&lt;CharSequence, Boolean&gt;,因此参数不能为空。为什么?

【问题讨论】:

  • 你也可以在kotlin > 1.2.0中使用String::isNotBlank
  • 我不太了解您的问题。你为什么不直接使用来自 kotlin 的 aString.isNullOrEmpty()?
  • 使用 String::isNullOrEmpty 而不是 StringUtils::isNotBlank 会产生同样的问题

标签: kotlin type-inference


【解决方案1】:

这是预期的行为。 :: 左侧的类型实际上是您将作为第一个参数传递给引用的实例的类型,因此类型推断使用它作为KFunction1 的第一个参数。

如果您希望在 StringUtils? 对象上可调用引用,请使用 StringUtils?::isNotBlank,但 StringUtils::isNotBlank 引用将只接受非空的 StringUtils 对象。

Reference

【讨论】:

  • 在您的问题中,您使用了 String::isNotBlank,这是一个 Kotlin 函数 CharSequence.isNotBlank(): Boolean。注意那里没有问号。 OP 询问 Java 方法 StringUtils.isNotBlank
  • 您的代码没有重现该问题,因为 Kotlin 正确推断出String::isNotBlank 的非空接收器。
  • 另一种方法的基本原理是不引入另一个依赖项。 String::isNullOrBlank 似乎更合适。
  • 真实原因更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
相关资源
最近更新 更多