具体的问题应该是 类型参数<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()); //这个就会报错
----------------------------------------------------------------------------------------------------------------------------------------