给定一个具有可空字段的数据类,为什么我不能只传递不可为空的字段来构造它呢?

我已经看过这个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提交一张门票.

Kotlin相关问答推荐

如何在Jetpack Compose中的列中渲染图像

在Kotlin中将ClosedRange字符串转换为List?<>

Kotlin:有限的并行性并不是限制并行性

jOOQ Kotlin Coroutines - Select all and exists查询

TzdbZoneRulesProvider 在 java.time 中不工作

在kotlin中匹配多个变量

Kotlin:调用 CoroutineScope.launch 与在协程内启动之间的区别

使用 StateFlow 时如何移除监听器?

返回 kotlin 中的标签和 lambda 表达式

为什么这个 Kotlin 代码不起作用? (如果 str[index] 在列表中,则打印)

如何使用 Either monad 并避免嵌套 flatMap

异常传播如何在 CoroutineScope.async 上工作?

Moshi:解析单个对象或对象列表(kotlin)

listOf() 返回 MutableList

Kotlinwhen表达式在使用主题时是否支持复合布尔表达式?

Kotlin 的 isNullOrBlank() 函数是否可以导入 xml 以用于数据绑定

Android Studio 和 Kotlin:Unresolved reference: also

kotlin RecyclerView分页

有没有办法在Kotlin中设置一个私有常量

Android Jetpack Compose 中的文本渐变