文章目录
一、泛型的由来
1、Collection的缺陷
2、泛型的由来背景
二、泛型的好处
1、类型安全
2、消除强制类型转化
三、泛型的格式
1、为什么泛型使用<>
2、泛型格式
四、泛型的简单使用
一、泛型的由来
1、Collection的缺陷
Java语言的集合有一个缺点:当我们把一个对象丢进集合后,集合就会忘记这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型(其运行时类型没变)。
2、泛型的由来背景
如果能向我们定义数组一样,在定义的时候就能明确指定元素类型,例如ArrayList<String>
,这说明此ArrayList只能保存字符串对象。Java的这种参数化类型被称为泛型。
JDK1.5版本后出现的新特性,用于解决安全问题,是一个安全机制。
二、泛型的好处
1、类型安全
将运行时期出现的ClassCastException转移到编译时期,方便程序员解决问题,让运行问题减少,安全。
2、消除强制类型转化
避免了强制转换的麻烦。这使得代码更加可读,并且减少了出错机会。尽管减少了强制类型转换可以降低使用泛型类代码的复杂度,但是声明泛型变量会带来相应的复杂度。
三、泛型的格式
1、为什么泛型使用<>
{}被程序结构使用,()被参数使用, [] 被数组使用,就剩<>了。
2、泛型格式
通过<>来定义要操作的引用数据类型(类类型,接口类型,数组除外)。通常在集合中很常见,当使用集合时,将集合中要存储的数据类型作为参数传递要<>中即可。其实<>就是用来接收类型的。从JDK1.5后,你可以为任何类或者接口增加泛型声明。
四、泛型的简单使用
1、简单例子演示ClassCastException
我们都知道集合可以装任意对象。并用迭代器去访问集合中的对象。
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add(4); // list.add(new Integer(4)); JDK1.5后会自动装箱
Iterator it = list.iterator();
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str+":"+str.length());
}
}
运行结果
1:1
2:1
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.lemon.GenericTest.main(GenericTest.java:14)
分析:
当用迭代器访问到对象2的时候,强转出现类型错误。注意:这个是在运行期间。我们可以想象,当我们将程序打包给用户的时候,用户处于运行阶段,那是不是就造成程序终止运行。我们希望能在编辑的阶段就能都把这些问题解决掉。问题的产生,就是因为我们往集合中存了不同类型的对象。
于是乎我们将程序修改如下:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add(4); // list.add(new Integer(4));
Iterator<String> it = list.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str+":"+str.length());
}
}
继续编译我们的程序(编译失败,程序由运行时期出现问题转移到编译时期,方便程序员解决问题,让运行时期问题减少),终端命令行:javac GenericDemo.java
继续修改如下:
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
Iterator<String> it = list.iterator(); //迭代器声明类型,使用next便不需要强转!!!
while(it.hasNext()){
String str = it.next();
System.out.println(str+":"+str.length());
}
}
依然是命令行,javac GenericDemo.java,发现编译通过,并且以前出现类似下面的警告也一并消除了(类型安全)
2、泛型的基本使用
当我们在看API文档的时候会发现,有些泛型用,而有些用,其实这个T和E只是个形式参数。你可以这么理解,T=type,E=Elements 。
( 1 ) 定义泛型接口:比较器ComatorJDK 1.5 后改写了集合框架中的接口和类接口,并为这些接口和类增加了泛型支持。