协变 | 逆变 | |
---|---|---|
kotlin | out | in |
java | extends | super |
逆变
//kotlin版本
interface Consumer<in T> {
fun comsume(item : T)
}
//java版本
interface Consumer<? super T>{
void consume(T item)
}
逆变用于消费场景,consume函数接收类型为T,Consumer能消费产品T以及T的父类
协变
//kotlin版本
interface Producer<out T> {
fun produce(): T
}
//java版本
interface Producer<? extends T>{
T produce()
}
协变用于生产场景,produce函数返回类型是T,这样我们就能安全的读取Producer产生的产品:T或T的子类
总结
消费者的T类型范围要大于生产者,消费者范围尽可能大,用super,生产者范围要尽可能小,用extends,这样才安全。
网友评论