Note我查看了以下问题/答案来解决问题,但没有任何运气。从 Kotlin 调用 Java Varargs 方法 https://stackoverflow.com/questions/36626152/call-java-varargs-method-from-kotlin- 这个在参数列表的末尾有可变参数参数,但我的问题涉及参数列表开头的可变参数。Kotlin:将列表转换为 Java 可变参数 https://stackoverflow.com/questions/45854994/kotlin-convert-list-to-java-varargs- 相同。其他搜索也得到同样的结果。这些是我能找到的最接近的。
我正在调用 KotlinString.split
具有单个字符分隔符的方法。
这是一个vararg
方法其中vararg
参数是多个参数中的第一个。该方法的定义如下:
public fun CharSequence.split(vararg delimiters: Char,
ignoreCase: Boolean = false,
limit: Int = 0): List<String>
当我调用如下方法时,它可以正常编译:
fun String.splitRuleSymbol() : String = this.split(':') //ok
但是当我尝试添加ignoreCase
and limit
参数,我遇到一个问题:
fun String.splitRuleSymbol() : String = this.split(':', true, 2) //compiler error
我得到的错误是...
不能使用提供的参数调用以下函数:
public fun CharSequence.split(vararg delimiters: String,ignoreCase: Boolean = ..., limit: Int = ...): kotlin.text 中定义的列表
public fun CharSequence.split(vararg delimiters: Char,ignoreCase: Boolean = ..., limit: Int = ...): kotlin.text 中定义的列表
对我来说,拥有一个vararg
参数后跟其他参数有点奇怪,但这不是重点。如果我按如下方式调用它,它就可以正常工作:
// both of the following compile
fun String.splitRuleSymbol() : String =
this.split(delimiters = ':', ignoreCase = true, limit = 2)
fun String.splitRuleSymbol2() : String =
this.split(';', ignoreCase = true, limit = 2)
有没有办法通过vararg Char
进入此方法,而无需使用参数名称限定我的其他两个参数ignoreCase
and limit
?编译器能不能告诉我们剩下的参数不是Char
?
我努力了扩展运算符 https://kotlinlang.org/docs/reference/java-interop.html#java-varargs以及下面的其他一些方法,但都不起作用:
//compiler errors on all these
this.split(*':', true, 2) //using the "spread" operator
this.split(*charArrayOf(':'), true, 2)
this.split(*mutableListOf(':'), true, 2)
this.split(*Array<Char>(1) { ':' }, true, 2)
是的,我知道其中一些看起来很荒谬。但是,有没有办法避免冗长的选择呢?
PS当我提出问题时,我发现了另一个可以编译的表达式。
this.split(':', limit = 2)
这不太冗长,因为我不需要更改默认值ignoreCase
参数,它更接近我正在寻找的。