Kotlin の error: no set method providing array access は明示的にキャストして型を合わせると解消できる
fun main(argv: Array<String>) { val d = LongArray(10) d[0] += 1 // error: no set method providing array access d[0] += 1L // good d[0] = d[0] + 1 // good val x = 2 d[1] += x // error: no set method providing array access d[1] += x.toLong() // good }
このコンパイルエラーは
- Doubleの配列にInt, Floatなど、型が異なるときに発生する
- +=に限らず、ほかの演算代入でもエラーが発生する
- プリミティブ配列、ArrayList
、MutableList なども同様にエラーが起きる - List
でも同様のエラーが発生するがListはReadOnlyなので期待通りのエラーである
疑問なのは、KotlinではLongにIntを演算代入すること(a += b)は問題なくできるのに、Longの配列の要素に対してIntの演算代入すること(a[i]+=b)はできないということ。3年前のバグ報告があるので将来的には型の異なる加算代入を可能、もしくは不可能で統一されるかもしれない。
https://youtrack.jetbrains.com/issue/KT-19249
Kotlinにおいて演算子は糖衣構文で、aがオブジェクトである場合 a += b は a.plusAssign(b)、a[i] = b は a.set(i, b) にそれぞれ等しい。Operator overloading - Kotlin Programming Language
しかし、a[i] += b は定義されておらず挙動が不明である。おそらく a[i] = a[i] + bに変換されるはずだが、この場合は型が異なっていても+演算が吸収するはず。それができていない理由は不明である。