这是泛型嘛,泛型简单的意思就是说,你不知道你想要的这个类具体是啥,但是你可以知道这个类的相关子类或者父类
所以从上面的观点来看, extends A> 和
例如下面这个两个方法表达的意思是一样的,都表示参数是一个集合,这个集合可能包含着A或者A的任何子类
public void someMethod(List extends A> list);
public void someMethod(Listlist);
这是一种情况,但是相比而言,一个类中,多处方法都需要这个泛型的时候,
// 前面定义了T,后面参数就可以用T表示了
publicvoid some(List t);
上面是方法里,这个范围比较窄,放在类里,效扮棚果更明显,比如:
public class B{
// 一个A类或者A子类的变量
private T a;
// 一个方法
public void some(Listlist);
}
所以可以看到,差别也不太大
经常发现有List< super T>、Set
extends
List< extends Number> foo3的通配符声明,意味着以下的赋值是合法的: // Number "extends" Number (in this context) List< extends Number> foo3 = new ArrayList< extends Number>(); // Integer extends Number List< extends Number> foo3 = new ArrayList< extends Integer>(); // Double extends Number List< extends Number> foo3 = new ArrayList< extends Double>();
读取操作通过以上给定的赋值语句,你一定能从foo3列表中读取到的元素的类型是什么呢?你可以读取到Number,因为以上的列表要么包含 Number元素,要么包含Number的类元素。你不能保证读取到Integer,因为foo3可能指向的是List
写入操作过以上给定的赋值语句,你能把一个什么类型的元素合法地插入到foo3中呢?你不能插入一个Integer元素,因为foo3可能指向 List
super
现在考虑一下List< super T>。
List<轿森 super Integer> foo3的通配符声明,意味着以下赋值是合法的: // Integer is a "superclass" of Integer (in this context) List< super Integer> foo3 = new ArrayList
可以说没什么区别