zoukankan      html  css  js  c++  java
  • java泛型<? extends E> 有上限通配符与<? Super E>有上限通配符

    通配符?,?表示占位,表明将来使用的时候在指明类型

    •  <?>无限定的通配符, 是让泛型能够接受未知类型的数据
    • <? extends E> 有上限通配符,能够接受指定类及其子类类型的数据,E就是该泛型的上边界 
        • 注意:这里不仅继承了父类E的子类,也可以代指显现了接口E的类
    • <? super E>:有下限的通配符。能够指定其父类类型的数据,E就是该泛型类型的下边界。
      •   注意:你可以为一个泛型指定上边界或者下边界,但是不能同时指定上下边界

    与<T>类型比较

    • 比起<T>类型,<?>通配符不需要定义类型,传入的默认为Object,所以在方法返回值使用<?>需要将Object向下转型为需要的类型
    • 可以直接在类中定义静态方法,因为其<?>的类型默认为Object,是确定的类型,不需要像<T>要在方法返回值之前进行定义
    • public static void main(String[] args) {
              List<Person1> personList = new ArrayList<>();
              personList.add(new Person1("11", "11"));
              personList.add(new Person1("22", "22"));
              personList.add(new Person1("33", "33"));
              print(personList);
      
              System.out.println("======================");
      
              List<Man> manList = new ArrayList<>();
              manList.add(new Man("11", "11"));
              manList.add(new Man("22", "22"));
              manList.add(new Man("33", "33"));
              print(manList);
          }
      
          /**
           *  List<? extends Person1> :有上限的通配符,表示传入的对象只能是Person1 或其的子类, <E>元素类型代表这个泛型通配符的上限
           * @param list
           */
          static void print(List<? extends Person1> list) {
              for (Object o : list) {
                  System.out.println(o);
              }
          }

     <? Super E>有上限通配符

    • 只能传递有E 及其父类到上限通配符中
  • 相关阅读:
    549 小程序阶段2:小程序架构和配置
    548 小程序阶段1:邂逅小程序开发
    546 JavaScript的 动态 import 导入
    544 Promise.allSettled,可选链操作符 --> ?.
    543 class类的私有属性
    542 Array.prototype.flat 与 flatMap
    540 Object.fromEntries,trimStart 和 trimEnd
    539 对象的rest、spread 属性
    简单梳理Redux的源码与运行机制
    7个有用的Vue开发技巧
  • 原文地址:https://www.cnblogs.com/huanghuanghui/p/10153091.html
Copyright © 2011-2022 走看看