Kotlin平台类型和泛型

时间:2014-12-28 23:50:20

标签: kotlin

我遇到了最后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)
}

2 个答案:

答案 0 :(得分:2)

问题在于你答应返回一对List s:

fun List<String>.partitionWordsAndLines(): Pair<List<String>, List<String>> {

但实际上返回了一对Collection s:

inline fun <reified T> Collection<T>.partitionTo(...): Pair<Collection<T>, Collection<T>> {

任务的有用提示:

    The signature of the function 'toCollection()' from standard library may help you.

请在此处查看:https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/generated/_Snapshots.kt#L207

P.S。您为什么要在inline上使用reifiedpartitionTo

答案 1 :(得分:1)

检查您的返回类型partitionWordsAndLines(): **Pair, List>**,扩展名需要ListSet其中partitionTo返回Collection

这是固定版本

inline fun <reified T, C: MutableCollection<T>> Collection<T>.partitionTo(first: C, second: C, predicate: (T) -> Boolean): Pair<C, C>