Kotlin 如何强制调用某些构造函数/函数以使用命名参数?

Kotlin 如何强制调用某些构造函数/函数以使用命名参数?,kotlin,named-parameters,Kotlin,Named Parameters,我有一些构造函数和函数,我希望总是用命名参数调用它们。有没有办法要求这样做 我希望能够为具有许多参数的构造函数和函数以及那些在使用命名参数时读得更清楚的构造函数和函数做到这一点,等等。在Kotlin 1.0中,您可以使用stdlib 在Kotlin 1.1+中,您将获得“禁止的vararg参数类型:Nothing”,但您可以通过使用私有构造函数(如Nothing)定义自己的空类并将其用作第一个varargs参数来复制此模式 /* requires passing all arguments by

我有一些构造函数和函数,我希望总是用命名参数调用它们。有没有办法要求这样做


我希望能够为具有许多参数的构造函数和函数以及那些在使用命名参数时读得更清楚的构造函数和函数做到这一点,等等。

在Kotlin 1.0中,您可以使用stdlib

在Kotlin 1.1+中,您将获得“禁止的vararg参数类型:Nothing”,但您可以通过使用私有构造函数(如
Nothing
)定义自己的空类并将其用作第一个varargs参数来复制此模式

/* requires passing all arguments by name */
fun f0(vararg nothings: Nothing, arg0: Int, arg1: Int, arg2: Int) {}
f0(arg0 = 0, arg1 = 1, arg2 = 2)    // compiles with named arguments
//f0(0, 1, 2)                       // doesn't compile without each required named argument

/* requires passing some arguments by name */
fun f1(arg0: Int, vararg nothings: Nothing, arg1: Int, arg2: Int) {}
f1(arg0 = 0, arg1 = 1, arg2 = 2)    // compiles with named arguments
f1(0, arg1 = 1, arg2 = 2)           // compiles without optional named argument
//f1(0, 1, arg2 = 2)                // doesn't compile without each required named argument
由于
Array
在Kotlin中是非法的,因此不能创建
vararg nothings:Nothing
的值来传入(我想是反射不足)。虽然这看起来有点像黑客,我怀疑字节码中对于类型为
Nothing
的空数组有一些开销,但它似乎可以工作


这种方法不适用于不能使用
vararg
的数据类主构造函数,但这些构造函数可以标记为
private
,并且辅助构造函数可以与
vararg nothings:Nothing

一起使用,而语言的设计从来没有这样做过,我为你的聪明才智喝彩:)你可以用*arrayOf()来传播一系列的虚无。或者你应该可以,我think@Deanveloper我刚试过。我得到:“unsupported[Array in return type是非法的”和“不能使用'Nothing'作为具体化的类型参数”。即使可以,例如,
f0(*arrayOf(),0,1,2)
中的后续参数也会与扩展数组的内容相结合,从而导致不同的错误:“整数文字不符合预期的类型Nothing”。在Kotlin
1.3.72
中不起作用时,表示类型Nothing是禁止的vararg@DimaRostopira请参阅关于1.1+的注释,我在回答中将其上移以澄清,您需要创建自己的
Nothing
(您可以随意称呼它,例如,
禁止
)相关Kotlin bug: