zoukankan      html  css  js  c++  java
  • Java中<? extends T>和<? super T>的总结*

    class Food{}
    
    //Lev 2
    class Fruit extends Food{}
    
    //Lev 3
    class Apple extends Fruit{}
    class Banana extends Fruit{}
    //Lev 4
    class RedApple extends Apple{}
    class Plate<T>{
        private T item;
        public Plate(T t){item=t;}
        public void set(T t){item=t;}
        public T get(){return item;}
    }
    • <? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”
    • 不能往里存,只能往外取,set( )方法失效。但取东西get( )方法还有效并且读取出来的东西只能存放在Fruit或它的基类里甚至Object
    • Plate<? extends Fruit> p=new Plate<Apple>(new Apple());

      p.set(null);

      //不能存入任何元素

      p.set(new Fruit());    //Error

      p.set(new Apple());    //Error

      Object object=p.get();

      Food food=p.get();

      Fruit fruit=p.get();

      Apple apple=p.get();    //Error

      RedApple redApple=p.get();    //Error

      Banana banana=p.get();    //Error

    •  对于集合少许不一样的地方

      List<? extends Fruit> list1; // list1 的元素在赋值的类型只能是 C 和 C 的子类。

      ArrayList<Food> a = new ArrayList<>();

      ArrayList<Fruit> b = new ArrayList<>();

      ArrayList<Apple> c = new ArrayList<>();

      ArrayList<Banana> d = new ArrayList<>();

      ArrayList<RedApple> e = new ArrayList<>();

      list1 = a; // 报错

      list1 = b;

      list1 = c;

      list1 = d;

      list1 = e;

      Object object = list1.get(0);

      Food food = list1.get(0);

      Fruit fruit = list1.get(0);

      Apple apple = list1.get(0);// 报错

      RedApple red = list1.get(0);// 报错

      Banana banana = list1.get(0);// 报错

      add():编译器只知道类型是 Fruit 或 Fruit 的子类,所以有可能是 Fruit Apple RedApple Banana 其中一个类型,为保证类型安全不能添加除了 null 以外的任何元素,即使是 Fruit 本身也不行。

      get():既然编译器不知道此时集合中的元素是Fruit Apple RedApple Banana 的哪一个,返回类型只能是他们共同父类 Fruit 或者父类Food类甚至Object。

    • <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”
    • 不影响往里存,set( )方法正常。但往外取只能放在Object,对象里get( )方法部分失效,只能存放到Object对象里。

      Plate<? super Fruit> p=new Plate<Fruit>(new Fruit());

      //存入元素正常

      p.set(new Fruit());

      p.set(new Apple());

      p.set(new Apple());

      p.set(new Banana());

      //读取出来的东西只能存放在Object类里。

      Object object=p.get();

      Food food=p.get();    //Error

      Fruit fruit=p.get();    //Error

      Apple apple=p.get();    //Error

      Banana banana=p.get();    //Error

    •  对于集合少许不一样的地方

      List<? super Fruit> list2; // list2 的元素在赋值的类型只能是 Fruit和 Fruit 的父类。

      ArrayList<Object> o = new ArrayList<>();

      ArrayList<Food> a = new ArrayList<>();

      ArrayList<Fruit> b = new ArrayList<>();

      ArrayList<Apple> c = new ArrayList<>();

      ArrayList<Banana> d = new ArrayList<>();

      ArrayList<RedApple> e = new ArrayList<>();

      list2 = o; 

      list2 = a; 

      list2 = b;

      list2 = c; // 报错

      list2 = d; // 报错

      list2 = e;// 报错

      list2.add(new Object());// 报错

      list2.add(new Food());// 报错

      list2.add(new Fruit());

      list2.add(new Apple());

      list2.add(new Banana());

      list2.add(new RedApple());

      Object objectL = list2.get(0);

      Food foodL = list2.get(0);

      Fruit fruitL = list2.get(0);

      Apple appleL = list2.get(0);// 报错

      RedApple redL = list2.get(0);// 报错

      Banana bananaL = list2.get(0);// 报错

    • add():编译器只知道类型是 Fruit 或者 Fruit 的父类,所以有可能是 Fruit Object其中一个类型。编译器知道下界是 Fruit ,根据类型向上兼容所以可以添加的元素是 Fruit 以及 Fruit 的子类

      get():既然编译器不确定集合类型是 Fruit Object 的哪一种,返回类型只能是他们的共同父类 Object 。

  • 相关阅读:
    MRC与ARC两种模式的相互兼容
    解决获取的手机序列号卸载应用重新安装时序列号变动的问题
    屏幕截图
    图片右下角显示水印
    在一个工程中建两个端口(司机端和货主端)
    左右侧边栏抽屉效果
    第二阶段第一天站立会议总结
    第十天站立会议总结
    第九天站立会议总结
    第八天站立会议总结
  • 原文地址:https://www.cnblogs.com/chenxibobo/p/13330798.html
Copyright © 2011-2022 走看看