out 协变
- 对标Java里的 extend
- 在方法需要返回的地方使用
- 举例 如果A继承B
interface Box<out T> {
fun get(): T
}
// case 1
val box = new Box<A>()
val a: A = box.get() // 这个时候是不会报错的,因为get()返回永远是A的子类
// case 2
interface Box<in T> {
fun get(): T
}
val box = new Box<A>()
val a: A = box.get() // 这个时候是会报错的,因为get()返回的不一定是A
// 还可能是A的其他父类A1,A2,A3..., 所以子类是不能指向父类的
in 逆变
- 对标Java里的super
- 在方法参数传入的地方需要使用
- 如果一个类既要参数泛型又要获取返回的泛型就不适用in & out