加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 湛江站长网 (https://www.0759zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

extends与super 通配符的差异

发布时间:2022-12-09 11:25:18 所属栏目:编程 来源:
导读:  在定义泛型类型Generic的时候,也可以使用extends通配符来限定T的类型:

  public class Generic<T extends Number> { ... }

  现在,我们只能定义:

  Generic<Number> p1 = null;

  

  在定义泛型类型Generic的时候,也可以使用extends通配符来限定T的类型:
 
  public class Generic<T extends Number> { ... }
 
  现在,我们只能定义:
 
  Generic<Number> p1 = null;
 
  Generic<Integer> p2 = new Generic<>(1, 2);
 
  Generic<Double> p3 = null;
 
  因为Number、Integer和Double都符合。
 
  非Number类型将无法通过编译:
 
  Generic<String> p1 = null; // compile error!
 
  Generic<Object> p2 = null; // compile error!
 
  因为String、Object都不符合,因为它们不是Number类型或Number的子类。
 
  我们看一个例子:
 
  public class Test {
 
  
 
      static class Food {
 
  
 
      }
 
  
 
      static class Fruit extends Food {
 
      }
 
  
 
      static class Apple extends Fruit {
 
      }
 
  
 
      static class Orange extends Fruit {
 
      }
 
  
 
      public void testExtend() {
 
          List<? extends Fruit> list = new ArrayList<Apple>();
 
  
 
          //无法安全添加任何具有实际意义的元素,报错,extends为上界通配符,只能取值,不能放.
 
          //因为Fruit的子类不只有Apple还有Orange,这里不能确定具体的泛型到底是Apple还是Orange,所以放入任何一种类型都会报错
 
  
 
          //list.add(new Apple());
 
          //list.add(new Orange());
 
  
 
          //可以添加null,因为null可以表示任何类型
 
          list.add(null);
 
  
 
          //可以正常获取,用java多态
 
          Food foot = list.get(0);
 
          Apple apple = (Apple) list.get(0);
 
      }
 
  
 
      public void testSuper() {
 
          List<? super Fruit> list = new ArrayList<Fruit>();
 
  
 
          //super为下界通配符,可以存放元素,但是也只能存放当前类或者子类的实例,以当前的例子来讲,
 
          list.add(new Fruit());
 
          list.add(new Apple());
 
  
 
          //无法确定Fruit的父类是否只有Food一个(Object是超级父类)
 
          //因此放入Food的实例编译不通过,只能放自己的实例 或者根据java多态的特性放子类实例
 
          //list.add(new Food());
 
          //List<? super Fruit> list2 = new ArrayList<Apple>();
 
          //Fruit fruit = list.get(0); //不能确定返回类型
 

(编辑:PHP编程网 - 湛江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!