Java中泛型的领略与等价实现
副标题#e#
泛型是Java SE 1.5的新特性,泛型的本质是参数化范例,也就是说所操纵的数据范例被指定为一个 参数。这种参数范例可以用在类、接口和要领的建设中,别离称为泛型类、泛型接口、泛型要领。
Java语言引入泛型的长处是安详简朴。
在Java SE 1.5之前,没有泛型的环境的下,通过对范例Object的引用来实现参数的“任意化 ”,“任意化”带来的缺点是要做显式的强制范例转换,而这种转换是要求开拓者对实 际参数范例可以预知的环境下举办的。对付强制范例转换错误的环境,编译器大概不提示错误,在运行 的时候才呈现异常,这是一个安详隐患。
泛型的长处是在编译的时候查抄范例安详,而且所有的强制转换都是自动和隐式的,提高代码的重用 率。
泛型在利用中尚有一些法则和限制:
1、泛型的范例参数只能是类范例(包罗自界说类),不能是简朴范例。
2、同一种泛型可以对应多个版本(因为参数范例是不确定的),差异版本的泛型类实例是不兼容的 。
3、泛型的范例参数可以有多个。
4、泛型的参数范例可以利用extends语句,譬喻。习惯上成为“有界范例”。
5、泛型的参数范例还可以是通配符范例。譬喻Class classType = Class.forName (java.lang.String);
泛型尚有接口、要领等等,内容许多,需要耗费一番工夫才气领略把握并纯熟应用。在此给出我曾经 相识泛型时候写出的两个例子(按照看的印象写的),实现同样的成果,一个利用了泛型,一个没有使 用,通过比拟,可以很快学会泛型的应用,学会这个根基上学会了泛型70%的内容。
例子一:利用了泛型
public class Gen﹤T﹥ {
private T ob; //界说泛型成员变量
public Gen(T ob) {
this.ob = ob;
}
public T getOb() {
return ob;
}
public void setOb(T ob) {
this.ob = ob;
}
public void showTyep() {
System.out.println("T的实际范例是: " + ob.getClass().getName ());
}
}
public class GenDemo {
public static void main(String[] args){
//界说泛型类Gen的一个Integer版本
Gen﹤Integer﹥ intOb=new Gen﹤Integer﹥ (88);
intOb.showTyep();
int i= intOb.getOb();
System.out.println ("value= " + i);
System.out.println("--------------------------- -------");
//界说泛型类Gen的一个String版本
Gen﹤String﹥ strOb=new Gen ﹤String﹥("Hello Gen!");
strOb.showTyep();
String s=strOb.getOb();
System.out.println("value= " + s);
}
#p#副标题#e#
例子二:没有利用泛型
public class Gen2 {
private Object ob; //界说一个通用范例成员
public Gen2(Object ob) {
this.ob = ob;
}
public Object getOb() {
return ob;
}
public void setOb(Object ob) {
this.ob = ob;
}
public void showTyep() {
System.out.println("T的实际范例是: " + ob.getClass().getName());
}
}
public class GenDemo2 {
public static void main(String[] args) {
//界说类Gen2的一个Integer版本
Gen2 intOb = new Gen2(new Integer(88));
intOb.showTyep();
int i = (Integer) intOb.getOb();
System.out.println("value= " + i);
System.out.println("------- ---------------------------");
//界说类Gen2的一个String版本
Gen2 strOb = new Gen2("Hello Gen!");
strOb.showTyep();
String s = (String) strOb.getOb();
System.out.println("value= " + s);
}
}
运行功效:
两个例子运行Demo功效是沟通的,节制台输出功效如下:
T的实际范例是:
java.lang.Integer
value= 88
----------------------------------
T的 实际范例是: java.lang.String
value= Hello Gen!
Process finished with exit code 0
看大白这个,今后根基的泛型应用和代码阅读就不成问题了。