在最后一个Kotlin Koans任务28中,当我试图调用partitionTo函数时,我会收到这些错误消息:
Error:(25, 12) Kotlin: Type inference failed. Expected type mismatch: found: kotlin.Pair<kotlin.Collection<kotlin.String!>, kotlin.Collection<kotlin.String!>> required: kotlin.Pair<kotlin.List<kotlin.String>, kotlin.List<kotlin.String>>
Error:(30, 12) Kotlin: Type inference failed. Expected type mismatch: found: kotlin.Pair<kotlin.Collection<kotlin.Char!>, kotlin.Collection<kotlin.Char!>> required: kotlin.Pair<kotlin.Set<kotlin.Char>, kotlin.Set<kotlin.Char>>我读到,类型末尾的感叹号表示平台类型。但那样的话,我就会想到类型是java.lang.String!,而不是kotlin.String!。我必须在某个地方强制执行空检查吗?也许有人能帮我完成最后一项任务。我正在使用IntelliJs Kotlin插件版本0.10.195。
这是我的密码:
fun List<String>.partitionWordsAndLines(): Pair<List<String>, List<String>> {
return partitionTo(ArrayList<String>(), ArrayList<String>()) { s -> !s.contains(" ") }
}
fun Set<Char>.partitionLettersAndOtherSymbols(): Pair<Set<Char>, Set<Char>> {
return partitionTo(HashSet<Char>(), HashSet<Char>()) { c -> c in 'a'..'z' || c in 'A'..'Z'}
}
inline fun <reified T> Collection<T>.partitionTo(first: MutableCollection<T>, second: MutableCollection<T>, predicate: (T) -> Boolean): Pair<Collection<T>, Collection<T>> {
for (element in this) {
if (predicate(element)) {
first.add(element)
} else {
second.add(element)
}
}
return Pair(first, second)
}发布于 2014-12-29 05:01:10
问题是,您承诺返回一对Lists:
fun List<String>.partitionWordsAndLines(): Pair<List<String>, List<String>> {但实际上返回了一对Collections:
inline fun <reified T> Collection<T>.partitionTo(...): Pair<Collection<T>, Collection<T>> {任务中的一个有用的提示:
The signature of the function 'toCollection()' from standard library may help you.请看这里:Snapshots.kt#L207
你为什么要在inline和reified上使用partitionTo
发布于 2014-12-29 04:52:31
检查您的返回类型partitionWordsAndLines(): **Pair, List>**,扩展需要List或Set,其中partitionTo返回Collection
这是固定版本
inline fun <reified T, C: MutableCollection<T>> Collection<T>.partitionTo(first: C, second: C, predicate: (T) -> Boolean): Pair<C, C>
https://stackoverflow.com/questions/27681817
复制相似问题