数组不能向上转型
package com.thinking.in.java.course.chapter15.two;
import com.thinking.in.java.course.chapter11.testArrays.App;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Fruit{}
class Apple extends Fruit{}
class Jonathan extends Apple{}
class Orange extends Fruit{}
public class CovarianArrays {
public static void main(String[] args) {
//
Fruit[] fruits = new Apple[10];
//fruits[0] = new Apple();
fruits[1] = new Jonathan();
try {
fruits[0] = new Fruit();
}catch (Exception e){
System.out.println(e);
}
try {
fruits[0] = new Orange();
}catch (Exception e){
System.out.println(e);
}
//泛型容器 在编译器就已经检测到异常了
List<? extends Fruit> fruitList = new ArrayList<Fruit>();
System.out.println(fruitList.contains(new Apple()));
List<? extends Fruit> list = Arrays.asList(new Apple());
//list.add(new Apple());
Apple apple = (Apple)list.get(0);
list = Arrays.asList(new Fruit());
System.out.println(list.contains(apple));
System.out.println(list.indexOf(apple));
}
}
public class GenericAndCovariance {
public static void main(String[] args) {
//无法添加任何数据
List<? extends Fruit> fruitList = new ArrayList<Fruit>();
//fruitList.add(new Apple());
//fruitList.add(new Fruit());
//fruitList.add(new Orange());
//fruitList.add(new Jonathan());
fruitList.add(null);
//因为contains方法的参数为Object类下 可以使用
fruitList.contains(new Apple());
}
}
超类通配符
List<? super ClassType> : 从类的继承关系来看的话,ClassType为上界,可以执行添加操作。注意与👆例子的区别
public class SuperTypeWilds {
public static void main(String[] args) {
List<? super Fruit> list = new ArrayList<>();
System.out.println(Arrays.toString(list.getClass().getTypeParameters()));
list.add(new Apple());
list.add(new Jonathan());
list.add(new Fruit());
System.out.println(list);
List<? extends Fruit> eList = new ArrayList<>();
//eList.add(new Apple());
}
}