为什么Java方法的Integer参数映射到Int而不是平台类型?

受另一个问题的启发。

fastutil库中有IntArrayList类,它有一个具有以下Java签名的方法:

 public void push(Integer o) 

从Kotlin被视为

 push(o: Int) 

有一个特定的原因,为什么它是Int而不是平台类型Int!

我期望它是push(o: Int!) ,至少是因为在Java源代码中使用Kotlin源代码定义的具有相同签名的方法具有Int! 作为从Kotlin中看到的参数类型(甚至在不同模块中定义,甚至从该模块的jar中导入)。

此外,所描述的行为导致push(Integer o)与具有Int参数合法的push(int o) (在同一个类中)冲突 – 它们都被视为push(o: Int) 。 如果有Int! Integer ,不会有冲突(我也试着在我的代码中定义这一对方法 – 仍然工作,因为我期望,有Int! )。


Kotlin版本是1.0.2

fastutil Gradle依赖:

 compile group: 'it.unimi.dsi', name: 'fastutil', version: '7.0.12' 

我怀疑这是一个kotlin编译器错误。 这里的问题是在由IntArrayList实现的接口IntStack中:

 interface Stack<T> { void push(T t); } interface IntStack extends Stack<Integer> { void push(int i); } 

Kotlin在接口IntStack只看到一个方法push(Int) ,或者更准确地说,kotlin错误地认为push(int i)是方法push(T t)的覆盖。