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