【发布时间】:2019-04-26 15:56:06
【问题描述】:
我有一个接受形式可变参数的方法
fun arrayOfArrays(vararg aoa: Array<Any>) {
}
现在,我无法理解如何调用此方法,例如
fun callArrayOfArrays() {
arrayOfArrays(arrayOf(1), arrayOf(1)) // 0) works
val a = arrayOf(1)
arrayOfArrays(a, a) // 1) type mismatch: inferred type Array, but Array was expected
val aoa = arrayOf(a)
arrayOfArrays(aoa) // 2) type mismatch: inferred type Array<array>, but Array was expected
arrayOfArrays(*aoa) // 3) type mismatch: inferred type Array<array>, but Array<out array> was expected
arrayOfArrays(aoa.toList().toTypedArray()) // 4) works
}
更新: 在得到同事的提醒后,我们认为向 arrayOf() 添加类型可以解决我的一些问题,即以下内容现在可以工作:
fun callArrayOfArrays() {
arrayOfArrays(arrayOf(1), arrayOf(1))
val a = arrayOf<Any>(1)
arrayOfArrays(a, a)
val aoa = arrayOf<Array<Any>>(a)
arrayOfArrays(*aoa)
arrayOfArrays(aoa.toList().toTypedArray())
arrayOfArrays(*(aoa.toList().toTypedArray()))
}
我仍然相信前者也应该没问题。我确实渴望对这种行为做出可以理解的解释。
我很欣赏案例 0 有效,但我无法理解所有其他案例。
对于案例 1,我希望将 arrayOf(1) 分配给变量不会改变语义,但我们就是这样。
对于案例 2,我希望它像我希望第一个案例一样工作,只是“Any”在这里是一个数组。
对于案例 3,我可以看到差异,但我不明白,当然也不知道如何使这个工作。
对于案例 4,我相信这是采用单个数组的 vararg。但是,我也不能传播。
【问题讨论】:
标签: arrays generics kotlin variadic-functions