kotlin的in和out
1 | class Animal {} |
1. 不可型变
1 | Result<Dog> dogResult = new Result<>(); |
虽然Dog
是Animal
的孩子,但是Java泛型是不可变型变,所以Result
不可以赋值给Result
.如果可以的话会发生什么情况呢?
1 | Result<Dog> dogResult = new Result<>(); |
所以为了安全考虑,java
设置了限制符? extends X ? super X
**2. 型变性通配符—- ? extends **
1 | Result<Dog> dogResult = new Result<>(new Dog()); |
? extends X
指定了 泛型的上界,也就是 X 或者是 X 的子类. 所以我们在取数据的时候是可以进行的,因为数据一定是 X 类型的, 但是不允许你插入数据.比如你看 ArrayList.addAll
方法:
1 | class ArrayList{ |
3.逆变型通配符 —- ? super
1 | Result<Dog> dogResult = new Result<>(new Dog()); |
? super X
规定了泛型下界X,必须是X或者是X的父类才行.
总结:
**? extends X ** :
- 限定了上界,泛型类型必须是 X 或者 X 的子类
- 此通配符只可以读,不可以写
- 对应的是
Kotlin
的out
? super X:
- 限定了下界,泛型的类型是 X 或者是 的父类
- 此通配符可以写 但是读没法确定类型.
- 对应的是
kotlin
的in
特别好的博客:地址