这是泛型嘛,泛型简单的意思就是说,你不知道你想要的这个类具体是啥,但是你可以知道这个类的相关子类或者父类
所以从上面的观点来看,<? extends A> 和 <T extends A>是没啥区别的
例如下面这个两个方法表达的意思是一样的,都表示参数是一个集合,这个集合可能包含着A或者A的任何子类
1
2
|
public
void
someMethod(List<?
extends
A> list);
public
void
someMethod(List<T
extends
A> list);
|
这是一种情况,但是相比而言,一个类中,多处方法都需要这个泛型的时候,<T extends A>要比<? extends A> 方便的多,就像在代码里,你声明了一个变量后,你就可以在这个变量的代码块里任何地方调用,同理<T extends A>就像是声明了一个泛型变量T,这个T是一个A或者A的子类,然后这个变量T在所能用的范围之内,你都可以直接用T表示,不用再写<? extends A>或者<T extends A>,比如:
1
2
|
// 前面定义了T,后面参数就可以用T表示了
public
<T
extends
A>
void
some(List<T> t);
|
上面是方法里,这个范围比较窄,放在类里,效果更明显,比如:
1
2
3
4
5
6
7
|
public
class
B<T
extends
A>{
// 一个A类或者A子类的变量
private
T a;
// 一个方法
public
void
some(List<T> list);
}
|
所以可以看到,差别也不太大