Consider this completely innocent piece of code:
var set = mutableSetOf<String>()
set += "abd"
I get a compiler error:
Error: Kotlin: Assignment operators ambiguity:
public operator fun Set.plus(element: String): Set defined in kotlin.collections
@InlineOnly public inline operator fun MutableCollection.plusAssign(element: String): Unit defined in kotlin.collections
This seems silly; how can +
and +=
ever be ambiguous? I clearly typed +=
! Also, while using +
is legal in that position, it’s not an assignment operator!
How do I make sense of this compiler error and/or language feature?
This expression is ambiguous because it can be interpreted in two ways:
- either you intended to create a copy of set with the new element
set = set + "abd"
- or you wanted to mutate the existing set:
set.plusAssign("abd")
This behavior of += operator is described here: http://kotlinlang.org/docs/reference/operator-overloading.html#assignments
Uh. That is surprising.
Thanks!
I have a bad feeling about this. Those two sequences of statements have subtly different meanings:
val mset = mutableSetOf<String>()
mset += "abd"
var iset = setOf<String>()
iset += "abd"
If the type of a set is visually hidden (because it was inferred), I expect this to be error prone or at least a point of confusion.
1 Like