为什么 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)
。如果 Integer
有 Int!
,就不会有冲突(我也尝试在我的代码中定义这对方法 - 仍然按我预期的那样工作,有 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)
的重写。
灵感来自 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)
。如果 Integer
有 Int!
,就不会有冲突(我也尝试在我的代码中定义这对方法 - 仍然按我预期的那样工作,有 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)
的重写。