Getters不能在Kotlin中用于正确识别返回类型



我有一个数据类,其形式如下:

data class ContentElementField(val type: String) {
val text: String? = null
get() = requireNotNull(field)
val style: String? = null
get() = requireNotNull(field)
val path: String? = null
get() = requireNotNull(field)
val caption: String? = null
get() = requireNotNull(field)
}

当我想执行以下操作时,问题就出现了:

when (it.type) {
"text" -> TextElement(Text(it.text), Style(it.style))
"image" -> ImageElement(Path(it.path), Caption(it.caption))
}

编译器警告我You cannot send a nullable type to a function that does not accept nullable arguments.

即使字段被签名为可为null,它的getter也被签名为不可为null。

编译器应该使用getter来解决是否发出此警告。

你会提供什么来解决这个问题?

如果当前值为null,getter是否发生崩溃也没关系-类型仍然是可为null,getter的返回类型仍然是String?

你为什么要这么做?为什么不把字段设为非null,让null赋值引发异常呢?这样你就不必与类型系统作斗争了。

如果你想的是不同的,这只是一个简单的例子,那么你有几个选择:

  • 在呼叫站点使用!!,因为您保证它不是null
"text" -> TextElement(Text(it.text!!), Style(it.style))
  • 通过非null属性公开私有的可为null属性:
// I see people do this a lot in Activities and Fragments even though
// they should probably just be making the one property lateinit instead
private val _text: String? = whatever
val text: String get() = requireNotNull(_text)
  • 也许看看Kotlin合约,它允许您向编译器保证值(没有示例,因为我从未使用过它(

不过,还不清楚你到底想做什么,也不清楚为什么这很有用。您的示例甚至是使用vals并将null分配给它们。无论您的真实用例是什么,都可能有更好的方法。

(此外,如果您不知道,非构造函数参数的属性不包括在基本的data class行为中,即其equals/hashCode/toString实现中。使类型为非null有帮助的另一个原因是,您可以将它们粘贴在构造函数中,而不必执行此逻辑(

最新更新