可変長引数vararg
今日はまたハマったので、メモです。
varargについての説明は色んな所にあるので、あんまり記述はしません。
▼公式リファレンス(日本語訳版?)
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/functions.html
使い方
Javaの使い方
Javaだとこんな感じで使われてますね。
private String[] mItems
public void items(@NonNull final String... items) {
mItems = items;
}
引数をString...とやるとArray(配列)で渡すことができます。
そもそもKotlinだと、配列は
Array<T>
で表すことができます。
ということで、Kotlinでの使い方を見てみましょう。
Kotlin化してみる
↑のJavaのコードをKotlin化します。
var mItems: Array<String>? = null // itemsメソッドで代入するのでvar。
fun items(varargs items: String) {
mItems = items // エラー
}
エラーになる
Javaと同じように、そのまま配列のフィールドに代入しようとすると、エラーになります。
ようするにvarargsの値はそのまま代入できません。
エラーの原因
どうやら、varargsは配列として渡せますが、Array<out T>
という型になっているようです。
対処法
StackOverflowに書いてあります。
https://stackoverflow.com/questions/44090019/how-to-pass-vararg-as-array-to-function-in-kotlin
リファレンスにも書いてあります。
すでに配列を持っており、関数にその内容を渡したい場合は、( * を配列名の接頭辞にする)
(公式リファレンスより引用)
ということで、kotlinの場合は以下のようになります。
var mItems: Array<String>? = null
fun items(varargs items: String) {
mItems = arrayOf(*items)
}
ようするに、Array型の値を、Arrayで作り直した上で代入します。
他にいい方法があれば教えて下さいー!!