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) } 

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

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

但实际上还是返回了一对Collection

 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

PS为什么要使用inlinepartitionTo

检查你返回的类型partitionWordsAndLines(): **Pair, List>** ,扩展需要ListSet where partitionTo返回Collection

这里是固定版本

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