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

  • 相关阅读:
    Java中判断两个列表是否相等
    chrome:插件、跨域、调试....
    mac 开发环境采坑
    webpack升级踩坑
    js-使用装饰器去抖
    React setState 笔试题,下面的代码输出什么?
    react 解决:容器组件更新,导致内容组件重绘
    centos使用ngnix代理https
    javascript 理解继承
    js 数据监听--对象的变化
  • 原文地址:https://www.cnblogs.com/Jomini/p/14159365.html
Copyright © 2011-2022 走看看