Java
Android
Kotlin

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で作り直した上で代入します。

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