数组不能向上转型

    1. package com.thinking.in.java.course.chapter15.two;
    2. import com.thinking.in.java.course.chapter11.testArrays.App;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.List;
    6. class Fruit{}
    7. class Apple extends Fruit{}
    8. class Jonathan extends Apple{}
    9. class Orange extends Fruit{}
    10. public class CovarianArrays {
    11. public static void main(String[] args) {
    12. //
    13. Fruit[] fruits = new Apple[10];
    14. //fruits[0] = new Apple();
    15. fruits[1] = new Jonathan();
    16. try {
    17. fruits[0] = new Fruit();
    18. }catch (Exception e){
    19. System.out.println(e);
    20. }
    21. try {
    22. fruits[0] = new Orange();
    23. }catch (Exception e){
    24. System.out.println(e);
    25. }
    26. //泛型容器 在编译器就已经检测到异常了
    27. List<? extends Fruit> fruitList = new ArrayList<Fruit>();
    28. System.out.println(fruitList.contains(new Apple()));
    29. List<? extends Fruit> list = Arrays.asList(new Apple());
    30. //list.add(new Apple());
    31. Apple apple = (Apple)list.get(0);
    32. list = Arrays.asList(new Fruit());
    33. System.out.println(list.contains(apple));
    34. System.out.println(list.indexOf(apple));
    35. }
    36. }

    15.10 通配符 - 图1
    15.10 通配符 - 图2

    1. public class GenericAndCovariance {
    2. public static void main(String[] args) {
    3. //无法添加任何数据
    4. List<? extends Fruit> fruitList = new ArrayList<Fruit>();
    5. //fruitList.add(new Apple());
    6. //fruitList.add(new Fruit());
    7. //fruitList.add(new Orange());
    8. //fruitList.add(new Jonathan());
    9. fruitList.add(null);
    10. //因为contains方法的参数为Object类下 可以使用
    11. fruitList.contains(new Apple());
    12. }
    13. }

    超类通配符
    15.10 通配符 - 图3
    List<? super ClassType> : 从类的继承关系来看的话,ClassType为上界,可以执行添加操作。注意与👆例子的区别

    1. public class SuperTypeWilds {
    2. public static void main(String[] args) {
    3. List<? super Fruit> list = new ArrayList<>();
    4. System.out.println(Arrays.toString(list.getClass().getTypeParameters()));
    5. list.add(new Apple());
    6. list.add(new Jonathan());
    7. list.add(new Fruit());
    8. System.out.println(list);
    9. List<? extends Fruit> eList = new ArrayList<>();
    10. //eList.add(new Apple());
    11. }
    12. }