Inspired by another question.
In fastutil
library there's IntArrayList
class which has a method with the following Java signature:
public void push(Integer o)
From Kotlin it is seen as
push(o: Int)
Is there a specific reason why it is Int
and not platform type Int!
?
I expected it to be push(o: Int!)
at least because a method with the same signature defined in Java source within the project with Kotlin sources has Int!
as parameter type seen from Kotlin (even defined in different module, and even imported from jar of that module!).
Also, the described behavior causes push(Integer o)
to conflict with push(int o)
(in the same class) which has Int
parameter legally -- they are both seen as push(o: Int)
. If there was Int!
for Integer
, there would be no conflict (I tried also to define this pair of methods in my code -- still works as I expect, there's Int!
).
Kotlin version is 1.0.2
.
Gradle dependency for fastutil
:
compile group: 'it.unimi.dsi', name: 'fastutil', version: '7.0.12'
I suspect that it is a kotlin compiler bug.
Problem here is in interface IntStack
which is implemented by IntArrayList
:
interface Stack<T> {
void push(T t);
}
interface IntStack extends Stack<Integer> {
void push(int i);
}
Kotlin sees only one method push(Int)
in interface IntStack
, or, more precisely, kotlin wrongly supposes that push(int i)
is an override of method push(T t)
.
来源:https://stackoverflow.com/questions/37625983/why-is-integer-parameter-of-java-method-mapped-to-int-and-not-platform-type