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

posted @ 2020-12-19 15:41  抽象Java  阅读(1252)  评论(0编辑  收藏  举报