当前位置: 首页 > 知识库问答 >
问题:

Kotlin编译器的类型推断不能选择调用哪个方法(与泛型类型的歧义)

冯宪
2023-03-14

因此,我有一些带有这些签名的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 public open fun join中(分隔符:CharSequence!,vararg Array:String!):String!在JavaClass中定义

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

共有1个答案

安毅
2023-03-14

我不认为这是科特林的具体问题。问题是泛型参数E的类型为charsequence,因此您的调用就变成了类似于join(“separator”,“word1”,“word2”),这确实是不明确的,因为E==charsequence类型的第一个参数与其他arg的类型相同。

 类似资料:
  • 问题内容: 以下代码在t3行中出现编译错误: 错误消息是: 类型不匹配:无法从对象转换为T 我知道我可以使用强制转换或手动绑定来解决问题,我的问题是: 编译器进行自动绑定是否如此困难,是否会失败? 编辑:添加了错误消息。 编辑:添加了另一个示例如何不会发生该错误。 编辑:删除了第二个示例,因为它令人困惑,使问题更加清楚。 问题答案: 在第一种情况下,您有两个具有名为的类型参数的泛型方法,但是这些类

  • Kotlin编译器在这里发出警告(未检查的强制转换): 据我所知,Kotlin smart cast应该知道由检查。 Java代码和编译器给出了完全相同的结果。 为了为每个实现获得正确的util类,我在伴生对象上创建了一个函数,该函数基于泛型类型T的参数为每个实现返回正确的util类,该参数扩展了a:,因此返回类型为。 但是,当我为的每个派生类编写函数体时,使用检查参数的类型,然后使用返回正确的u

  • 我需要 Kotlin 中的一个集合来仅包含实现给定接口的元素。 例如:包含动物集合的地图: 通过阅读文档、博客和SO问题,我编写了使用Generics in关键字的代码: 现在我想在Test类中添加一个读取“data”内容的方法,例如将其打印到控制台: 如果我这样做,我会遇到编译错误: 我的解决方案是强制我的动物进入一个ArrayList 但是我不确定这是编写这种代码的最好方式。有没有更好的方式告

  • 问题内容: 考虑以下代码: 排序调用给出错误: 绑定不匹配:类型为Collections的通用方法sort(List )不适用于参数(ArrayList >)。推断的类型MyItem 不是有效替代边界参数<T扩展Comparable <?超级T>> 为什么会这样呢? 如果实施该工具,那为什么不能替代呢? 抱歉,是否有人提出这个问题,但我觉得这个问题有些具体。 问题答案: 实际上,对该错误的更详细说

  • 在stackoverflow中还没有讨论的情况下,我遇到了“不兼容类型”编译器错误(例如,为什么这个通用java代码不能编译?)。 我的期望很简单--我调用的是一个模板化方法,它不使用包含类的任何“泛型”类,因此它应该从方法参数中提取模板参数的类型,并且在所有情况下都应该编译--但我得到了“不兼容类型”编译器错误。 我注意到解决这个问题的奇怪方法--在方法参数中向泛型datatype添加“<?ex

  • 此代码只是使用中间的来删除重复项,其中元素之间的相等性是根据提供的比较器定义的。 让我们给局部类型推断一个机会吧,我(天真地)想...于是我将上面的代码改为: 这对我来说是有意义的,因为的类型可以从的类型推断出来,或者我是这么想的。但是,修改后的代码无法编译,并生成以下错误: 注意1:编译代码的一种方法是将返回类型更改为。不过,那是一套很难用的... 注意2:另一种方法是在比较器中不使用逆变,但我