为什么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)
。