fishList.add(new Fish());
List animalList = new ArrayList<>();
animalList.add(new Cat());
animalList.add(new Fish());
List<? super Fish> fish1 = fishList;
List<? super Fish> fish2 = animalList;
fish1.add(new Fish());
Fish fish = fish2.get(0); //报错
}
从变量 fish1、fish2
的类型声明上只能知道里面存储的都是鱼的父类,如果这里也不报错的话可就从 fish2
的集合里拿出一只猫赋值给一条鱼了,这属于谋杀亲鱼。所以肯定也是不行。? super
类型通配符所表达的逆变就是这个意思。
kotlin
中对于协变和逆变也提供了两个修饰符:
-
out
:声明协变; -
in
:声明逆变。
它们有两种使用方式:
-
第一种:和
java
一样在使用处声明; -
第二种:在类或接口的定义处声明。
当和 java
一样在使用处声明时,将上面 java
示例转换为 kotlin
:
fun extendsFun() {
val fishList: Mu