假设有一个类A,以下两个方法有什么区别
<T extends A> void test(List<T> list);
void test(List<? extends A> list);
<T extends A> void test(List<T> list);表示List里面装的某一类型.
void test(List<? extends A> list);表示里面是任一类型.
区别就是某一类型是确定的,通配符只能调用与参数类型无关的方法,而T类型可以调用与参数类型相关的方法。
<T extends A> void test(List<T> list); 这种方式,是在方法前先定义了一个类型T,T继承自A,List<T> list,list中的元素必须是T类型的,也就是说,list中的元素类型要一样。void test(List<? extends A> list); 这种方式,是指list中只要放入A的子类型的就行了,但是一个非final类的子类是可以有很多个的,所以用这种方式时,list中的元素类型是可以不相同的,只要它们都是A的子类型就行了。
其实你说的二者在本质上并没有太大的区别,都可以存储任意类型的数据。
|