zoukankan      html  css  js  c++  java
  • Java泛型(二)<T> 和<?> 的区别

      具体的问题应该是 类型参数<T>通配符<?> 的区别

      <T> 用来声明泛型类 和 泛型方法

      <?> 用来使用泛型类 和 泛型方法

    一、类型参数 <T> 

    1、声明泛型类型的类型参数

      类型参数 <T> 用来约束成员元素的类型, 比如以下这个例子,就是约束 item 1 和 item 2的元素类型。

    class Box<T>{
        private T item1;
        private T item2;
    }

      最常出现的地方就是 List<T>, 定义一个泛型List容器, 比如在ArrayList的源码头里的

    public class ArrayList<E> extends AbstractList<E> implement List<E>,.......{
    
    }

      不过List 的容器库已经写好了,直接引用就可以了,不用再定义。

      那么什么时候才会再用到呢, 比如如下

    Class Box<T>{
      private List<T> items;
      public List<T> get(){return T;}
      public void set(List<T> t){item=t;}      
    }

    2、声明泛型类型的方法

      另外一种会出现List<T>的地方是泛型方法。 比如 Function 类的 reduce 是个静态泛型方法,负责对列表里,所有元素求和。

      这里的List<T> 出现在参数,函数返回值和函数内部,用来保持泛型类型得的一致性。

    Class Function{
      public static <T> List<T> reduce(List<T> list){
          // .... do something  
        }  
    }

       还有比如用来声明接口的方法

    public interface Dao{
      List<T> getList(){};
    }
    
    List<String> getStringList(){
      return dao.getList();//dao是一个实现类实例
    }
    
    List<Integer> getIntList(){
      return dao.getList();
    }

    3、声明泛型类 不能使用 无界通配符<?>

      类型通配符不能拿来声明泛型来进行约束,比如如下,是错误的

    class Box<?>{
        private ? item1;
        private ? item2;
    }

    二、泛型通配符 <?>

      <?> 用来使用泛型类 和 泛型方法

    1、使用泛型类

      比如

    List<?> list = new ArrayList<String>();

    2、有界通配符<? extends XXX>,<? super XXX>

      比如:

    public Class Fruit(){}
    
    public Class Apple extends Fruit(){}
    
    public void test(? extends Fruit){};
    
    test(new Fruit());
    test(new Apple());
    test(new String()); //这个就会报错

     ----------------------------------------------------------------------------------------------------------------------------------------

    [1] : https://www.zhihu.com/question/31429113

  • 相关阅读:
    Top 10 Product Manager Skills To Boost Your Resume In 2021
    大数据知识梳理
    B端产品如何设计权限系统?
    华三盒式交换机MAC、ARP、Route性能表项参数查询
    中了传说中的挖矿病毒
    SqlServer 2019 事务日志传送
    docker中生成的pdf中文是方框的解决方案
    The Live Editor is unable to run in the current system configuration
    2021 面试题大纲
    五分钟搞定Docker安装ElasticSearch
  • 原文地址:https://www.cnblogs.com/Jomini/p/14159365.html
Copyright © 2011-2022 走看看