Java基础增强------泛型
http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
一、概述:
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型“信息,使源程序远行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样,由编译器生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据,例如,用反射得到集合,在调用其add()方法即可。
二、功能:
2.1泛型是在JDK1.5版本出现的新特性,用于解决安全问题,是一个安全机制。
2.2将运行时期出现的问题ClassCastException,转移到了编译时期,方便程序员解决问题,让运行事情问题减少,安全。
2.3避免了强制类型转换麻烦。
注:在JDK1.5中还是可以不使用泛型,只是编译器提示报告unchecked警告。
三、泛型的特点:
3.1 类型安全
泛型的主要目标是提高Java程序的类型安全。通过使用泛型定义的变量的类型限制,编译器可以再编译时检验类型合法性。如果没有泛型,那么类型的安全性主要由编译者来把握,这显得不如带有泛型的程序安全性高。
3.2 性能改善
泛型的另外一个附带优点,就是能消除源代码中的许多强制类型转换。这使得代码可读性好,并减少了出错的机会。
3.3 性能改善
泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换插入生成的字节码中。但是更多的类型信息可用于编译器这一事实,为未来版本的JVM的优化带来改进。
3.4擦出
泛型的实现方式采用了“擦出”方式。Java语言中的泛型基本上完全在编译器中实现,编译器生成的代码与手工编写的不用泛型程序的类型,但进行强制类型转换所得到的代码基本相同,泛型只是更能确保类型安全。
四、泛型中常用的术语
ArrayList<E>类型定义和Arraylist<Integer>类引用及如下术语:
整个称为Arraylist<E>泛型
Arraylist<E>中的E称为类变量或类型参数
整个Arraylist<Integer>称为参数化的类型
Arraylist<Integer>中的Integer称为类型参数的实例或实际类型参数
Arraylist<Integer>中的<>念着Typeof
Arraylist称为原始类型
参数化类型与原始类型的兼容性:
<span style="font-size:14px;">参数化类型可以引用一个原始类型的对象,编译报告警告,例如,
Collection<String> c = new Vector();
原始类型可以引用一个参数化类型的对象:编译报告警告,例如,
Collection c = new Vector<String>();
参数化类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Object>();错误
</span>
泛型中的类型参数严格说明集合中装载的数据类型是什么和可以加入什么类型的数据,记住Collection<String>与Collection<Object>是两个没有转换关系的参数化类型。
以下案例外,演示泛型在应用中的简单对比。突出泛型功能的优点。
<span style="font-size:14px;">package ClassDemo;
import java.util.ArrayList;
public class TTestDemo {
/**
* @param args
* 类的功能为说明泛型在类中的应用案例
*/
public static void main(String[] args) {
ArrayList aList = new ArrayList();
aList.add(1);
aList.add(2L);
aList.add("str");
int i = (Integer) aList.get(3);//编译时需要强制类型转换
ArrayList<String> aList = new ArrayList<String>();
aList.add("a");
aList.add("b");
aList.add("c");
String str = aList.get(3);//在取元素时不需要进行强制类型转换
}
}
</span>
证:
源程序远行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样?
<span style="font-size:14px;"> //定义两个ArrayList存储不同的数据类型。
ArrayList<Integer> aList1 = new ArrayList<Integer>();
ArrayList<String> aList = new ArrayList<String>();
//获取Arraylist的字节码比较字节码是否相等。
System.out.println(aList.getClass() == aList1.getClass());
通过反射机制向集合中添加不同类型的数据。
//通过反射机制向集合中添加不同的元素
ArrayList<String> arrayList = new ArrayList<String>();
Method addMethod = arrayList.getClass().getMethod("add",Object.class);
addMethod.invoke(arrayList, 50);
Iterator iterator = arrayList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
</span>