关于java中泛型的上下限和读取模式先看这篇文章
Java中泛型上下限及读写模式
对java中有一定的了解后,再来看kotlin中与之对应的定义
作用 | Java | kotlin |
---|---|---|
可读不可写 | extends | out |
可写不可读 | super | in |
代码中实现如下,注释写的很清楚,不支持的都注释了,可以自己敲一敲感受一下
/**
* kotlin 中 用out 和in 分别对应 ? extends 和 ? super
* out === ? extends 可读不可写
* in === ? super // 可写不可读
*/
open class FatherClass {}
class ChildClass : FatherClass() {}
fun test() {
// 为什么kt中可以直接这样写?因为在kotlin的List中,已经声明了<out E>
// public interface List<out E> : Collection<E> {
var list: List<FatherClass> = ArrayList<ChildClass>()
val f: FatherClass = list.get(0);
// val c: ChildClass = list.get(0);
// list.add() 没有add 要用MutableList才有add
// MutableList是对List的封装
var list1: MutableList<out FatherClass> = ArrayList<ChildClass>()
val f1 = list1.get(0)
// 可读不可写
// list1.add(FatherClass())// 报错
// list1.add(ChildClass())// 报错
var list2: MutableList<in ChildClass> = ArrayList<FatherClass>()
// val c : ChildClass = list2.get(0) // 报错,可写不可读
list2.add(ChildClass())
// list2.add(FatherClass())// 报错
}
// kotlin中,可以直接在类中进行限制,在当前类中,T只能写,不能读
abstract class GenericKT<in T> {
fun addData(data: T) {
}
// 不能读
// abstract fun getData(): T
}
// 只能读不能修改
class OutTest<out T> {
fun getData(): T? = null
//报错 不能写
// fun setData(data: T){}
}