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类型
  • 使用带泛型的类创建对象时,等式两边指定的泛型必须一致
  • 等式两边可以在任意一边使用泛型,在另一边不使用(考虑向后兼容)

先写到这里,以后再详细介绍。。。

原文地址:https://www.cnblogs.com/Wilange/p/7735984.html