【发布时间】:2017-05-20 11:34:35
【问题描述】:
所以,我有一些带有这些签名的 Java 方法(为简单起见,删除了注释和代码主体):
public class JavaClass {
public static <E extends CharSequence> E join(E... array) { ... }
public static <E extends CharSequence> E join(CharSequence separator, E... array) { ... }
}
我在 Kotlin 中有一些代码,它调用了“join”方法:
class KtClass {
fun test(vararg array: String) {
JavaClass.join(*array)
}
}
到目前为止一切顺利;它将传播可变参数并调用前一个方法签名。好啊!
例如,如果我想使用“分隔符”参数调用后一个方法签名,就会出现问题:
class KtClass {
fun test(vararg array: String) {
JavaClass.join("<br>", *array)
}
}
此代码无法编译。编译器无法决定调用哪个方法。错误:
错误:(5, 13) Kotlin:在未完成类型推断的情况下无法在以下候选中进行选择: public open fun join(vararg array: String!): String!在 JavaClass 中定义 公共开放乐趣加入(分隔符:CharSequence!,可变参数数组:字符串!):字符串!在JavaClass中定义
我什至不能命名参数,因为 Kotlin 不允许为非 Kotlin 函数命名参数。
编辑: 用 Java 方法标头中的普通 String 引用替换了 E 泛型类型参数,并且成功了!所以我猜这是类型推断与泛型类型或类似类型的不兼容?
我很确定这一定是 spread operator (*)。但是如果我不使用它,我无法将可变参数array 传递给join 函数。
如何在不接触 Java 代码的情况下解决这个问题?
是的,我知道有 Array.joinToString 扩展函数,但这只能解决这种特殊情况。我需要知道一个通用的解决方案。
【问题讨论】:
-
请检查here 描述的未经检查的演员表是否可以帮助您。
标签: generics kotlin overloading kotlin-interop