有没有办法使用默认值的非可选参数时通过null?

例如,如果我有以下数据类:

data class Data( val name: String = "", val number: Long = 0 ) 

和可以返回null函数:

 fun newName(): String? {} fun newNumber(): Long? {} 

我知道我可以使用下面的函数的值,如果它们不为null

 val newName = newName() val newNumber = newNumber() val data = Data( if (newName != null) newName else "", if (newNumber != null) newNumber else 0 ) 

但是,有没有办法只是使用Data类的构造函数中指定的默认值,当值为null

我找不到任何文件,但我希望这样的事情可以工作:

 val data = Data(newName()?, newNumber()?) 

但是这不能编译。

您可以创建一个辅助构造函数 ,它在接收null时使用相同的默认值:

 data class Data( val name: String = "", val number: Long = 0 ) { constructor( name: String? = null, number: Long? = null ) : this( name ?: "", number ?: 0 ) } 

次构造器只支持Nullable原始属性。 这意味着如果该属性不是基本类型,将导致2个相同的构造函数,例如:

 data class Data(val name: String) { constructor(name: String? = null) : this(name ?: "foo"); // ^--- report constructor signature error } data class Data(val number: Long = 0) { constructor(number: Long? = null) : this(number ?: 0) // ^--- No problem since there are 2 constructors generated: // Data(long number) and Data(java.lang.Long number) } 

另一种方法是使用invoke操作符,例如:

 data class Data(val name: String) { companion object { operator fun invoke(name: String? = null) = Data(name ?: "") } } 

如果类不是数据类,那么可以从参数中初始化属性,而不是在主构造函数中定义属性,例如:

 class Data(name: String? = null, number: Long? = null) { val name = name ?: "" val number = number ?: 0 }