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

Why is Integer parameter of Java method mapped to Int and not platform type?

灵感来自 another question.

fastutil 库中有 IntArrayList class 有一个带有以下 Java 签名的方法:

public void push(Integer o)

在 Kotlin 中它被视为

push(o: Int)

它是 Int 而不是平台类型 Int! 有什么具体原因吗?

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

此外,所描述的行为导致 push(Integer o) 与合法具有 Int 参数的 push(int o)(在同一个 class 中)冲突——它们都被视为push(o: Int)。如果 IntegerInt!,就不会有冲突(我也尝试在我的代码中定义这对方法 - 仍然按我预期的那样工作,有 Int!)。


Kotlin 版本为 1.0.2

Gradle 对 fastutil 的依赖:

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) 的重写。