Kotlin已经内置了函数toTypedArray((。它将在不丢失类型的情况下将任何集合转换为数组。希望这正是你所需要的。
我正在制作一个带有一些存储过程的Neo4j插件。其中一个需要采用任意类型的参数,并将它们保存为Node上的属性。天真的我可能会这样做
val props: Map<String, Any> = <procedure input>
props.forEach(node::setProperty)
这适用于标量类型,但如果值是List,则会失败
java.lang.IllegalArgumentException:[[123]:java.util.ArrayList]不是受支持的属性值
因为setProperty
希望该值为数组。由于(我认为(类型的擦除,简单地将List强制转换为Array会导致Array<Any>
。
我有一个略显笨拙的解决方案:
props.forEach { (key, value) ->
if (value is Collection<*>) {
val firstElement = value.firstOrNull()
if (firstElement != null) {
val arrayValue: Array<Any?> =
java.lang.reflect.Array.newInstance(firstElement.javaClass, value.size) as Array<Any?>
value.forEachIndexed { index, element -> arrayValue[index] = element }
node.setProperty(key, arrayValue)
} else {
node.setProperty(key, emptyArray<Long>()) // Arrays need a type, so we just pick one
}
} else {
node.setProperty(key, value)
}
}
这是有效的,但有没有更简单的方法来做我想做的事?
var value = arrayListOf<String>("Foo","Bar")
var arrayValue : Array<String> = value.toTypedArray()
这是Kotlin标准图书馆的一部分。你可以在这里找到最新版本。