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