gpt4 book ai didi

generics - Kotlin 编译器的类型推断无法选择调用哪个方法(泛型有歧义)

转载 作者:行者123 更新时间:2023-12-01 00:35:35 25 4
gpt4 key购买 nike

所以,我有一些带有这些签名的 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)
}
}

这段代码不会编译。编译器无法决定调用哪个方法。错误:

Error:(5, 13) Kotlin: Cannot choose among the following candidates without completing type inference: public open fun join(vararg array: String!): String! defined in JavaClass public open fun join(separator: CharSequence!, vararg array: String!): String! defined in JavaClass



我什至无法命名参数,因为 Kotlin 不允许为非 Kotlin 函数命名参数。

编辑:用 Java 方法头中的纯字符串引用替换了 E 泛型类型参数,它起作用了!所以我猜这是类型推断与泛型类型或类似类型的不兼容?



我很确定这必须与 有关。点差运算符 (*)。但我无法传递可变参数参数 arrayjoin功能,如果我不使用它。

如何在不触及 Java 代码的情况下解决此问题?

是的,我知道有 Array.joinToString 扩展函数,但这只能解决这种特殊情况。我需要知道一个通​​用的解决方案。

最佳答案

我认为这不是 Kotlin 特有的。问题在于泛型参数 E类型为 CharSequence所以你的电话变成了 join("separator", "word1", "word2")这确实是不明确的,因为第一个参数是 E == CharSequence与其他参数的类型相同。

关于generics - Kotlin 编译器的类型推断无法选择调用哪个方法(泛型有歧义),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41493268/

25 4 0
文章推荐: jquery - 单击时在两个功能之间切换
文章推荐: jquery - 如何删除
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com