Edited at

Kotlin覚書 - varargを代入する方法

More than 1 year has passed since last update.


可変長引数vararg

今日はまたハマったので、メモです。

varargについての説明は色んな所にあるので、あんまり記述はしません。

▼公式リファレンス(日本語訳版?)

https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/functions.html


使い方


Javaの使い方

Javaだとこんな感じで使われてますね。


java

private String[] mItems

public void items(@NonNull final String... items) {
mItems = items;
}


引数をString...とやるとArray(配列)で渡すことができます。

そもそもKotlinだと、配列は

Array<T>

で表すことができます。

ということで、Kotlinでの使い方を見てみましょう。


Kotlin化してみる

↑のJavaのコードをKotlin化します。


kotlin

var mItems: Array<String>? = null // itemsメソッドで代入するのでvar。

fun items(varargs items: String) {
mItems = items // エラー
}



エラーになる

Javaと同じように、そのまま配列のフィールドに代入しようとすると、エラーになります。

ようするにvarargsの値はそのまま代入できません。


エラーの原因

image.png

どうやら、varargsは配列として渡せますが、Array<out T>という型になっているようです。


対処法

StackOverflowに書いてあります。

https://stackoverflow.com/questions/44090019/how-to-pass-vararg-as-array-to-function-in-kotlin

リファレンスにも書いてあります。

すでに配列を持っており、関数にその内容を渡したい場合は、( * を配列名の接頭辞にする) (公式リファレンスより引用)

ということで、kotlinの場合は以下のようになります。


kotlin

var mItems: Array<String>? = null

fun items(varargs items: String) {
mItems = arrayOf(*items)
}


ようするに、Array型の値を、Arrayで作り直した上で代入します。

他にいい方法があれば教えて下さいー!!