欢迎来到天天文库
浏览记录
ID:62033539
大小:56.00 KB
页数:16页
时间:2021-04-15
《java泛型编程笔记[1].doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JAVA泛型编程笔记ﻩﻩﻩﻩﻩﻩﻩ——by书生1介绍Java泛型编程是JDK1。5版本后引入的。泛型让编程人员能够使用类型抽象,通常用于集合里面.下面是一个不用泛型例子:List myIntList=newLinkedList();//1myIntList.add(newInteger(0));//2Integerx=(Integer)myIntList。iterator()。next();//3注意第3行代码,但这是让人很不爽的一点,因为程序员肯定知道自己存储在List里面的对象类型是Integer,但是在返回列表中元素时,还是必须强制转换类型,这是为什么呢?原因在于,
2、编译器只能保证迭代器的next()方法返回的是Object类型的对象,为保证Integer变量的类型安全,所以必须强制转换。这种转换不仅显得混乱,更可能导致类型转换异常ClassCastException,运行时异常往往让人难以检测到。保证列表中的元素为一个特定的数据类型,这样就可以取消类型转换,减少发生错误的机会, 这也是泛型设计的初衷。下面是一个使用了泛型的例子:List();//1’myIntList.add(newInteger(0)); //2’Integerx=myIntLis
3、t.iterator().next();//3’ﻩ在第1行代码中指定List中存储的对象类型为Integer,这样在获取列表中的对象时,不必强制转换类型了。2定义简单的泛型下面是一个引用自java.util包中的接口List和Iterator的定义,其中用到了泛型技术。public interfaceList〈E>{voidadd(E x);Iterator〈E〉iterator();}publicinterfaceIterator〈E〉 {Enext();booleanhasNext();}ﻩ这跟原生类型没有什么区别,只是在接口后面加入了一个尖括号,尖括号里面是一个类型
4、参数(定义时就是一个格式化的类型参数,在调用时会使用一个具体的类型来替换该类型)。也许可以这样认为,Listiterator();}类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上.编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上,因此泛型类型中的静态变量是所有实例共享的。此外,需要注意的是,一个static方法,无法访问泛型类的类型参数,因为类还没有
5、实例化,所以,若static方法需要使用泛型能力,必须使其成为泛型方法。类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。在使用泛型时,任何具体的类型都被擦除,唯一知道的是你在使用一个对象。比如:List在运行事实上是相同的类型。他们都被擦除成他们的原生类型,即List。因为编译的时候会有类型擦除,所以不能通过同一个泛型类的实例来区分方法,如下面的例子编译时会出错,因为类型擦除后,两个方法都是List类型的参数,因此并不能根据泛型类的类型来区分方法。/*会导致编译时错误*/ ﻫ
6、public class Erasure{ publicvoidtest(List〈String〉 ls){ System.out。println(”Sting"); } publicvoidtest(List<Integer〉li){ﻫ System.out.println("Integer"); }ﻫ }ﻩ那么这就有个问题了,既然在编译的时候会在方法和类中擦除实际类型的信息,那么在返回对象时又是如何知道其具体类型的呢?如List7、〉编译后会擦除掉String信息,那么在运行时通过迭代器返回List中的对象时,又是如何知道List中存储的是String类型对象呢?ﻩ擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地点,这正是编译器在编译期执行类型检查并插入转型代码的地点。泛型中的所有动作都发生在边界处:对传递进来的值进行额外的编译期检查,并插入对传递出去的值的转型。3。泛型和子类型为了彻底理解泛型,这里看个例子:(Apple为Fruit的子类)Listapples =newArrayList()
7、〉编译后会擦除掉String信息,那么在运行时通过迭代器返回List中的对象时,又是如何知道List中存储的是String类型对象呢?ﻩ擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地点,这正是编译器在编译期执行类型检查并插入转型代码的地点。泛型中的所有动作都发生在边界处:对传递进来的值进行额外的编译期检查,并插入对传递出去的值的转型。3。泛型和子类型为了彻底理解泛型,这里看个例子:(Apple为Fruit的子类)Listapples =newArrayList()
此文档下载收益归作者所有