1.协变 逆变 不变
class Test<out T, in E, F>(val t: T, e: E, val f: F) {
private var e: E = e
fun get(): T = t
fun set(e: E) {
this.e = e
}
fun print() {
println("t = $t, e = $e, f = $f")
}
}
List<String> List<Any> 无任何关系
List<String> 是 List<out String>子类型
T : 协变 只读 这样的对象成为 生成者
E : 逆变 写入数据 这样的对象成为 消费者
F : 不变
<? extends T> = out
<? super T> = in
java 的PECS 原则:
extends限定了通配符类型的上界,所以我们可以安全地从其中读取;
而super限定了通配符类型的下界,所以我们可以安全地向其中写入。
我们把那些只能从中读取的对象称为生产者(Producer),
我们可以从生产者中安全地读取;只能写入的对象称为消费者(Consumer)。
因此这里就是著名的PECS原则:Producer-Extends, Consumer-Super
网友评论