Today I came across a piece of code that looked like this:
fun printAll(vararg names: String?) {
names.forEach { name ->
println(name)
}
}
and noticed that the IDE did not complain about using names
without checking if it is null names?.forEach { ... }
!
After decompiling Kotlin’s bytecode I saw that no matter what type I use (String?
or String
) the java code was the same:
public static final void printAll(@NotNull String... languages) {
//...
}
Does the Kotlin compiler ignore the nullable type completely? Turns out that yes!
And the reason is quite clear and straightforward but it hadn’t registered in my mind until now:
Note that
vararg
parameters are, as a rule, never nullable, because in Java there is no good way to distinguish between passingnull
as the entire vararg array versus passingnull
as a single element of a non-null vararg array.
What if we pass a null value?
As a matter of fact if you pass a null value:
printAll(null)
the compiler makes sure that the java code will be called with a null value casted to the appropriate type:
printAll((String)null);
which ends up in an array of strings that has one element!
Top comments (0)