给定一个具有可空字段的数据类,为什么我不能只传递不可为空的字段来构造它呢?
我已经看过这个related question了.是什么阻止Kotlin将空值隐式赋值给可为空的字段?
data class Blah(val id: Int, val name: String?)
val x = Blah(id = 2) // Complains I didn't pass a name ???
给定一个具有可空字段的数据类,为什么我不能只传递不可为空的字段来构造它呢?
我已经看过这个related question了.是什么阻止Kotlin将空值隐式赋值给可为空的字段?
data class Blah(val id: Int, val name: String?)
val x = Blah(id = 2) // Complains I didn't pass a name ???
没有技术原因阻止Kotlin被设计为使主构造函数的参数列表中的可为空的类型获得默认值null
,但它仍不是以这种方式设计的.
对于其中的原因,以下是一个可能的解释.
归根结底,您在数据类名后面放的(...)
首先是主构造函数的parameter list.是的,您可以在那里声明属性,但它仍然是主要的构造函数参数列表.处理这种特定类型的参数列表与其他参数列表的行为方式不同,会使Kotlin A little更加不一致.您希望普通的旧函数参数列表也这样做吗?
fun foo(number: Int?) { ... }
// Should you be able to call foo like this?
foo()
即使您希望每个参数列表都是这样的,但是如果您想要为某些功能 Select 不这样做呢?也许您编写了一个函数/数据类,而您的really希望调用者显式地将null
传递给它的一个参数,例如,为了确保调用者做出有意识的 Select .需要额外的复杂性(例如,像@NoDefaultNull
这样的新注释,或者像required
这样的新关键字--这一设计可以讨论很久)才能让你 Select 退出这种行为.
让主构造函数的参数列表像任何其他参数列表一样工作是最简单的 Select .如果您希望可空参数是可选的,只需添加= null
,就像处理任何其他参数列表一样.
如果你还有更好的主意,请随时向YouTrack提交一张门票.