Kotlin: "类型推断失败"

3

有人知道我做错了什么吗?

// ...
val alphabet = ('a'..'z').toList()
val str = "testing"
val arr = str.split("")

for (char in arr) {
    var i = alphabet.indexOf(char) // Throws Error!
    //    ...
}

indexOf方法的结果是

"Error:(10, 26) Kotlin:类型推断失败。类型参数T的值应在输入类型(参数类型、接收器类型或期望类型)中提到。尝试显式地指定它。"。

我尝试了"var i: Int = alphabet.indexOf(char)" 和 "alphabet.indexOf(char) as Int",但得到了相同的结果...

这里出了什么问题?


不必使用空字符串进行分割,你可以直接在字符串上调用 toList() 方法,或者甚至可以迭代原始字符串,因为 String 本身实现了 CharSequence 接口,所以应该可以使用 Char 数据类型进行迭代。for (char in str) {} - Animesh Sahu
太棒了。非常感谢。 - cluster1
1个回答

8
我认为你的问题在于你认为变量char包含一个Char值。如果是这样的话,那么indexOf接受Char值并找到该字符在调用该方法的字符列表(List<Char>)中的位置就是有意义的。但是str.split()返回的是List<String>而不是List<Char>,因此char是一个String。所以你让indexOf方法告诉你一个字符列表(List<Char>)中的一个String的位置,这是没有意义的。这就是问题的基础。具体如何转换成Kotlin编译器给出的错误信息,我不确定。
为了明确,这行代码产生了相同的错误:
var i = alphabet.indexOf("c") // Throws Error!

但编译器对这行代码很满意:

var i = alphabet.indexOf('c') // No Error!!!

你是完全正确的。我必须替换 'str.split()'。发现String有一个方法叫做'toCharArray()'。现在,一切都按预期工作了。非常感谢。 - cluster1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接