给定一个具有可为空字段的数据类,为什么我不能通过仅传递不可为空字段来构造它?
我已经看过这个相关问题了。是什么阻止 Kotlin 隐式将 null 分配给可为 null 的字段?
data class Blah(val id: Int, val name: String?)
val x = Blah(id = 2) // Complains I didn't pass a name ???
Run Code Online (Sandbox Code Playgroud)
没有任何技术原因阻止 Kotlin 被设计为主构造函数的参数列表中的可空类型获得默认null值,但它仍然不是这样设计的。
这是对其原因的可能解释。
归根结底,(...)您在数据类名称后面放置的首先是主构造函数的参数列表。是的,您可以在那里声明属性,但它仍然是主要构造函数参数列表。将这种特殊类型的参数列表处理为与其他参数列表不同的行为会使 Kotlin 更加不一致。您是否也想要普通的旧函数参数列表来执行此操作?
fun foo(number: Int?) { ... }
// Should you be able to call foo like this?
foo()
Run Code Online (Sandbox Code Playgroud)
即使您希望每个参数列表都像这样,但如果您想针对某些函数选择不这样做怎么办?也许您编写了一个函数/数据类,并且您确实希望调用者显式传递null给它的参数之一,以便确保调用者正在做出有意识的选择。需要额外的复杂性(例如,像这样的新注释@NoDefaultNull,或像这样的新关键字required- 这种设计可以讨论很长时间),以允许您选择退出这种行为。
使主构造函数的参数列表像任何其他参数列表一样工作是最简单的选择。如果您希望可为空的参数可选,只需= null像添加任何其他参数列表一样添加即可。
当您想省略参数时,请定义默认值,即使它是null:
data class Blah(val id: Int, val name: String? = null)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |