1 泛型
在Jdk1.5以前的版本中,如果我们通过 (ClassType)object 强制转换一个对象的时候,即使被转换的类型不是ClassType,在编译的时候,也不会报错,但是在运行的时候,就会抛出ClassCastException例外。
泛型就是为了获取编译时安全和运行是最小抛出ClassCastExcepiton例外。
例:
public class GenericSample<T>{
private T sample;
public void setSample(T sample){
this.sample = sample;
}
public T getSample(){
return sample
}
public static void main(String[] art){
GenericSample<String> gSampleString = new GenericSample<String>();
GenericSample<Date> gSampleDate = new GenericSample<Date>();
gSampleString.setSample("this is a generic");
gSampleDate.setDate(new Date("20090305"));
}
}
解释:
在上面例子中,我们定义了一个泛型类GenericSample,泛型类的类型是通过T来标记的。在实例化GenericSample的对象的时候,我们才具体指定类这个泛型类中T的类型。顾名思义,所谓泛型,就是可以可以接受所有的类型。
2 限定泛型类中T的类型
例:
public class GenericSample<T extends String>{
private T sample;
public void setSample(T sample){
this.sample = sample;
}
public T getSample(){
return sample
}
public static void main(String[] art){
GenericSample<StringChild1> gSampleChild1= new GenericSample<StringChild1>();
GenericSample<StringChild2> gSampleChild2 = new GenericSample<StringChild2>();
gSampleString.setSample("this is a generic");
gSampleDate.setDate(new Date(2009, 3, 5));
}
}
解释:
通过extends关键字,限定T的类型,T只可能是某个接口和类的子类(注意:接口,类都用extends关键字)。上面的例子,在实例化泛型类GenericSample的对象时,T只可以是String的子类。否则的话,编译会出错。
在public class GenericSample<T>中,虽然我们没有使用extends限定T,但是,实际上T是默认extends object的。
也就是说public class GenericSample<T>等价于public class GenericSample<T extends Object>
3 Jdk1.5 的集合类
在Jdk1.5中,集合类(List ,Collection, ArrayList, Array)都被泛型化了。这样我们从集合类对象中通过Get()方法取出对象的时候,无需进行类型转换,当然也不会发生ClassCastExcepiton例外。
3.1 定义一个容器类的引用:ContenerClassType<ClassType> listClassType
ContenerClassType: 容器类类型
ClassType:容器类中可以保存的对象类型
例如:List<String> listString = null;
3.2 实例化一个容器类对象:
new ContenerClassType<ClassType>()
例如:new List <String>()
3.3 List, List<?>, List<ClassType> 的区别
List:可以保存任意的对象。
List<?>:只可以保存任意的对象,但是一旦?被指定了,就只能保存?指定的对象。例如,List<String>只可以保存String对象。
List<ClassType>:只可以保存,ClassType类型的对象。