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

hot*_*key 8 java parameters kotlin fastutil

灵感来自另一个问题.

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

public void push(Integer o)
Run Code Online (Sandbox Code Playgroud)

来自Kotlin,它被视为

push(o: Int)
Run Code Online (Sandbox Code Playgroud)

是否有特定原因Int而不是平台类型Int!

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

此外,所描述的行为导致push(Integer o)push(int o)具有Int参数合法的(在同一类中)冲突- 它们都被视为push(o: Int).如果有Int!Integer,就没有冲突(我也试过在我的代码来定义这个对方法-仍然是如我所料,有Int!).


Kotlin版本是1.0.2.

Gradle依赖fastutil:

compile group: 'it.unimi.dsi', name: 'fastutil', version: '7.0.12'
Run Code Online (Sandbox Code Playgroud)

小智 10

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

interface Stack<T> {
    void push(T t);
}

interface IntStack extends Stack<Integer> {
    void push(int i);
}
Run Code Online (Sandbox Code Playgroud)

Kotlin push(Int)在界面中只看到一种方法IntStack,或者更准确地说,kotlin错误地认为这push(int i)是方法的重写push(T t).