java中的泛型
一、泛型的理解
泛型是JDK1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法,其作用类似于C++中的模板(templates),但是并不完全一样。泛型在java中主要应用在集合接口中。
- 增加泛型支持后的集合,可以记住集合中元素的类型,并可以在编译时检查元素的类型
- 增加泛型支持后的集合,可以让代码更加简洁、程序更加健壮
- java泛型还增加了枚举类、反射等方面的功能,使程序更加灵活
二、泛型的使用
- 不使用泛型,编译时不检查类型的异常
- 使用泛型,编译时自动检查类型
1 public class GenericsDemo { 2 3 public static void main(String[] args) { 4 // noGenerics(); 5 generics(); 6 } 7 8 //使用泛型的情况 9 private static void generics() { 10 ArrayList<String> strList = new ArrayList<String>(); 11 strList.add("liming"); 12 strList.add("wangfeng"); 13 //此处试图加入一个Integer对象,编译报错 14 // strList.add(100); 15 for (int i = 0; i < strList.size(); i++) { 16 //不需要强制转换 17 String string = strList.get(i); 18 System.out.println(string); 19 } 20 } 21 22 //不使用泛型的情况 23 private static void noGenerics() { 24 ArrayList strList = new ArrayList(); 25 strList.add("liming"); 26 strList.add("wangfeng"); 27 //此处不小心加入了一个Integer对象 28 strList.add(100); 29 for (int i = 0; i < strList.size(); i++) { 30 //strList中的元素全是Object类型,所以需要强制转换,但是最后一个元素会出现ClassCastException异常 31 //因为我们试图把最后一个元素的Integer类型转换为String类型 32 String string = (String)strList.get(i); 33 System.out.println(string); 34 } 35 } 36 }
三、泛型的深入理解
泛型的适用范围:当接口、类及方法中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。
但是需要注意几点:
- 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型,并且泛型的类型参数可以有多个
- 泛型到底代表什么类型取决于调用者传入的类型,如果没传,默认是Object类型
- 使用带泛型的类创建对象时,等式两边指定的泛型必须一致
- 等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容)
先写到这里,以后再详细介绍。。。