代码(如下所示)是否正确?这是从Kotlin-docs.pdf的第63页开始的,它也是https://kotlinlang.org/docs/reference/generics.html的最后一个代码片段
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但预期列表为
3. 无法访问&#39;克隆&#39;它受到
通过将代码更改为以下内容,可以轻松解决前两个错误:
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() }
}
我仍然收到以下错误:
无法访问&#39;克隆&#39;它受到
我使用的是Kotlin 1.1.2-release-IJ2017.1-1
我错过了什么吗?或者文档中是否有错误?
感谢。
答案 0 :(得分:0)
it.clone()
返回Any
,您会收到错误,将列表转换为列表。
所以,您已将其更改为List。
您的下一个错误是无法访问克隆:它在Cloneable 中受到保护。
这个问题可以通过使用公共方法创建我们自己的Cloneable接口来解决。