【发布时间】:2017-05-27 16:46:20
【问题描述】:
代码(如下所示)是否正确?取自 Kotlin-docs.pdf 的第 63 页,这也是 https://kotlinlang.org/docs/reference/generics.html 的最后一个代码 sn-p
fun <T> cloneWhenGreater(list: List<T>, threshold: T): List<T>
where T : Comparable, T : Cloneable {
return list.filter { it > threshold }.map { it.clone() }
}
按原样,编译器失败并显示: 1. kotlin 中定义的接口 Comparable 需要一个类型参数 2. 类型推断失败。预期类型不匹配:推断类型为 List,但预期为 List 3. 无法访问'clone':它在'Cloneable'中受到保护
通过将代码更改为以下内容,可以轻松解决前两个错误:
fun <T> cloneWhenGreater(list: List<T>, threshold: T): List<Any>
where T : Comparable<in T>, T : Cloneable {
return list.filter { it > threshold }.map { it.clone() }
}
我仍然收到以下错误: 无法访问“克隆”:它在“可克隆”中受到保护
我正在使用 Kotlin 1.1.2-release-IJ2017.1-1
我错过了什么吗?还是文档中有错误?
谢谢。
【问题讨论】:
-
看来文档确实是错误的。你应该提交一个错误:youtrack.jetbrains.com/issues/KT
-
那个特别的剪辑是added in June 2014,并且只在October 2015 中更改过一次,而更改则更糟。可能它当时确实编译过,但那时 Kotlin 仍处于快速发展阶段。
-
谢谢!提交了一个错误 (youtrack.jetbrains.com/issue/KT-18144)。将相应更新。
标签: kotlin