现在的位置: 首页 > 综合 > 正文

java generic 介绍

2014年10月24日 ⁄ 综合 ⁄ 共 2352字 ⁄ 字号 评论关闭

一 介绍

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动隐式的,提高代码的重用率。


二、泛型参数:

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 showType() {
		System.out.println("T的实际类型是: " + ob.getClass().getName());
	}
}

public class GenericParameter {
	public static void main(String[] args){
	//定义泛型类Gen的一个Integer版本
	Gen<Integer> intOb=new Gen<Integer>(100);
	intOb.showType();
	int i= intOb.getOb();
	System.out.println("value= " + i);
	System.out.println("----------------------------------");
	
	//定义泛型类Gen的一个String版本
	Gen<String> strOb=new Gen<String>("Hello Dylan!");
	strOb.showType();
	String s=strOb.getOb();
	System.out.println("value= " + s);
	
	}
}

output:

T的实际类型是: java.lang.Integer
value= 100
----------------------------------
T的实际类型是: java.lang.String
value= Hello Dylan!

三、泛型类:

 class GenericsFoo<T> {
	private T x;
	
	public GenericsFoo(T x) {
		this.x = x;
	}
	
	public T getX() {
		return x;
	}
	
	public void setX(T x) {
		this.x = x;
	}
}
public class GenericClass {
	public static void main(String args[]){
		GenericsFoo<String> strFoo=new GenericsFoo<String>("Hello Generics!");
		GenericsFoo<Double> douFoo=new GenericsFoo<Double>(new Double("33"));
		GenericsFoo<Object> objFoo=new GenericsFoo<Object>(new Object());
		System.out.println("strFoo.getX="+strFoo.getX());
		System.out.println("douFoo.getX="+douFoo.getX());
		System.out.println("objFoo.getX="+objFoo.getX());
	}
}

output:

strFoo.getX=Hello Generics!
douFoo.getX=33.0
objFoo.getX=java.lang.Object@1d0fafc

四 限制泛型:

import java.util.ArrayList;
import java.util.Collection;

class CollectionGenFoo<T extends Collection> {
	private T x;
	public CollectionGenFoo(T x) {
		this.x = x;
	}
	public T getX() {
		return x;
	}
	public void setX(T x) {
		this.x = x;
	}
}


public class GenericRestrict {

	public static void main(String[] args) {
		CollectionGenFoo<ArrayList> listFoo = null;
		listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());
		CollectionGenFoo<? extends Collection> listFoo1 = null;
		listFoo1=new CollectionGenFoo<ArrayList>(new ArrayList());
		System.out.println("实例化成功!");
	}

}

output:

实例化成功!

五  泛型方法:

public class GenericFunction {
	
	public <T> void f(T x) {
		System.out.println(x.getClass().getName());
	}
	
	public static void main(String[] args) {
		GenericFunction ea = new GenericFunction();
		ea.f(" ");
		ea.f(10);
		ea.f('a');
		ea.f(ea);
	}
}

output:

java.lang.String
java.lang.Integer
java.lang.Character
GenericFunction

-----------------------------

dylan    presents.

抱歉!评论已关闭.