LoginSignup
10
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-23

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

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

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7