2)声明或实例化一个泛型类的对象,把实际的类讲)声明或实例化一个泛型类的对象,型参数传递给它。型参数传递给它。Java3)调用实例化的泛型类对象的方法)1声明具有泛型参数的类
JavaAPI中的一个集合类是用于维护链接表数据中的一个集合类是用于维护链接表数据结构的LinkedList类,即java.util.LinkedList结构的类publicclassLinkedList
{booleanadd(Elemento){}ElementgetFirst(){}}
第二十一讲Java
Box.java泛型参数的目的是让类的设计具有通用性,但泛型参数的目的是让类的设计具有通用性,一次只能对一种特定的类型执行所有处理,一次只能对一种特定的类型执行所有处理,这些处理可用于不同的数据类型。理可用于不同的数据类型。2、实例化一个对象并把实际类型参数传递给泛型类、在设置了参数化的泛型类之后,在设置了参数化的泛型类之后,还需要创建类的实例,同时把实际类型参数传递给类实例。的实例,同时把实际类型参数传递给类实例。
第二十一讲Java
Collectionfamily=newLinkedList();Tablephonebook=newTable();代码说明:代码说明:
第二十一讲Java
1)phonebook是Table类型的对象具有)类型的对象,具有是类型的对象具有String和和Integer泛型参数分别匹配参数名泛型参数,分别匹配参数名泛型参数分别匹配参数名Key和Value。和。2)等号的右边说明调用)Table类的构造函数。类的构造函数。类的构造函数
3)phonebook引用的)引用的Table对象已经过特殊化处理,对象已经过特殊化处理,引用的对象已经过特殊化处理因此只能存储Integer对象的数值。整数可以通过类第对象的数值。因此只能存储对象的数值二型为String的键值进行访问。的键值进行访问。型为的键值进行访问十一讲4)当遇见”Type“字样的代码时,字样的代码时,)当遇见”字样的代码时一个其他类型的类型“可以理解为”一个其他类型的类型“。Java
调用实例化的泛型类对象的方法
如果还需要创建另一个表,如果还需要创建另一个表,用以存储通过Timestamp键访问的键访问的String对象,则我们可以继对象,键访问的对象续使用同一个泛型类Table,只是需要提供不同的,参数。参数。Tableappts=newTable();appts.put(newTimestamp(7,30,00),”feeddogs”);第二十一讲Java
泛型接口
同泛型类型一样,接口也可以利用泛型实现参数同泛型类型一样接口也可以利用泛型实现参数正如读者预期的那样,接口与类的参数化完全化。正如读者预期的那样接口与类的参数化完全一样。一样。1、未加泛型定义、中的Comparable接口定义示例如下:接口定义示例如下:在JDK1.4中的中的接口定义示例如下publicinterfaceComparable{intcompare(Objectobj);}第二十一讲Java
当一个类实现了Comparator接口后,就可以采接口后,当一个类实现了接口后用以下方式对两个对象进行比较:用以下方式对两个对象进行比较:intresult=myTimestamp.compareTo(youTimestamp);2、加入泛型的定义、publicinterfaceComparator{intcompare(Tthing);}
第二十一讲Java
这种类型参数记号与前面讲述的泛型类是完全一样实现上述接口的类可以声明如下:的。实现上述接口的类可以声明如下:第二十Timestamp.java一讲Java
加入泛型的定义
按照JAVA的设计,泛型是一个编译时的特性。的设计,泛型是一个编译时的特性。按照的设计实际上,在整个运行期间不存在任何实际类型参数,实际上,在整个运行期间不存在任何实际类型参数,不管泛型类实例化多少次,不管泛型类实例化多少次,泛型类型仅存在于一个类文件中,提供类型参数信息不同,类文件中,与编译时为实例提供类型参数信息不同,在运行时,在运行时,泛型的实例并不知道实际上究竟给了它什么类型参数。什么类型参数。第二十一讲
Java
但实际上类型参数可能是String类型,但泛型仍按类型,但实际上类型参数可能是类型Object存储,这就是编译程序为什么依然需要插入存储,存储强制类型转换代码的原因所在。强制类型转换代码的原因所在。这种运行时的健忘症称为“类型擦除”。使这种运行时的健忘症称为“类型擦除”用泛型参数时有三种限制,用泛型参数时有三种限制,其中一些泛型参数遵循类型擦除原则:循类型擦除原则:1.不能使用类型参数创建新的实例:不能使用类型参数创建新的实例:不能使用类型参数创建新的实例publicclassTable{valuev=newvalue();}
第二十一讲Java
2.不应在强制类型转换中使用类型参数,因为编不应在强制类型转换中使用类型参数,不应在强制类型转换中使用类型参数译程序无法检查强制类型转换的合法性。译程序无法检查强制类型转换的合法性。否则导致泛型试图避免的一种可能性----出现运行时类型致泛型试图避免的一种可能性出现运行时类型的强制类型转换异常。的强制类型转换异常。keyk2=(key)someobj;//warning3.所有的引用类型都拥有顶级父类所有的引用类型都拥有顶级父类(0bject)中定所有的引用类型都拥有顶级父类中定义的方法,例如,义的方法,例如,使用任何泛型参数调用toString()方法都是合法的。方法都是合法的。方法都是合法的Strings=v.toString();