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


问题内容

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

public void push(Integer o)

从科特林看来,这是

push(o: Int)

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

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

同样,所描述的行为也导致push(Integer o)push(int o)(具有相同类的)Int合法合法的参数发生冲突-
它们都被视为push(o: Int)。如果有Int!for Integer,那么就不会有冲突(我也尝试在代码中定义这对方法-
仍然可以按我期望的方式工作,有Int!)。


Kotlin版本是1.0.2

Gradle的依赖关系fastutil

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

问题答案:

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

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

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

Kotlin只能看到push(Int)接口中的一种方法IntStack,或者更准确地说,Kotlin错误地认为这push(int i)是method的替代push(T t)