泛型(generic) 是指参数化类型的能力。可以定义带泛型类型的类或方法,随后编译器会用具体的类型来替代它。例如,可以定义一个泛型栈类,它存储的是泛型元素。可以从这个泛型类生成一个包含字符串的栈对象和一个包含数字的栈对象。这里,字符串和数字都是替换泛型的具体类型。
使用泛型的主要优点:能够在编译时而不是在运行时检测出错误。泛型类或方法允许用户指定可以和这些类或方法一起工作的对象类型。如果视图使用一个不相容的对象,编译器就会检测出这个错误。
从JDK1.5开始,Java允许定义泛型类、泛型接口、泛型方法。可以使用泛型对Java API中的一些接口和类进行修改。
JDK1.5之前,java.lang.Comparable接口被定义为:
package java.lang;
public interface Comparable{
public int compareTo(Object o)
}
JDK 1.5 之后,被修改为:
package java.lang;
public interface Comparable
public int compareTo(T o)
}
这里的
举例:给出ArrayList类在JDK1.5之前和从JDK1.5开始的类图
Java.util.ArrayList
+ArrayList()
+add(o:Object):void
+add(index:int,o:Object):void
+clear():void
+contains(o:Object):boolean
+get(index:int):Object
+indexOf(o:Object) :int
+isEmpty():boolean
+lastIndexOf(o:Object):int
+remove(o:Object):boolean
+size():int
+remove(index:int):boolean
+set(index:int,o:Object) :Object
JDK 1.5之后
+ArrayList()
+add(o:E):void
+add(index:int,o:E):void
+clear():void
+contains(o:Object):boolean
+get(index:int):Object
+indexOf(o:Object) :int
+isEmpty():boolean
+lastIndexOf(o:Object):int
+remove(o:Object):boolean
+size():int
+remove(index:int):boolean
+set(index:int,o:E) :Object
例: ArrayList
现在,就只能向该线性表中添加字符串。
list.add("red");
如果视图向其中添加非字符串,就会产生编译错误。
list.add("white");
String s = list.get(0);
在JDK1.5之前,由于没有使用泛型,所以必须把返回值的类型转换成String,如下所示:
String s = (String)(list.get(0));
如果元素是包装类型,例如,Integer、Double、Character,那么可以直接将这个元素赋值给一个基本类型的变量。这个过程称为自动解包
例:
ArrayList
list.add(5.5);
list.add(3.0);
Double doubleObject = list.get(0);
double d = list.get(1);
++++++++++++++5.5和3.0自动转换为Double对象,并添加到list中。list中的第一个元素被赋给一个Double变量。在此无需类型转换,因为list被申明为Double对象。list中的第二个元素被赋给一个double变量。list.get(1)中的对象自动转换为一个基本类型的值。