JAVA泛型
一、使用泛型与不使用泛型的比较。
//不使用泛型
ArrayList al1=new ArrayList();//1
al1.add(new Integer(10));//2 这里可加入任何对象。
Integer i1=(Integer)al1.get(0);//3 这里必须做强制类型转换。如果前面程序不小心往al1中放入了非Integer对象,那么程序运行到此将会报一个类型转换异常(java.lang.ClassCastException)。
//使用泛型
ArrayList<Integer> al2=new ArrayList<Integer>();//1
al2.add(new Integer(10));//2 这里只能加入Integer对象。
Integer i2=al2.get(0);//3 这里不必做强制类型转换。不用再担心程序会报一个类型转换异常(java.lang.ClassCastException)。
二、如何定义简单泛型
/**
* 包: test
* 源文件:Gclass.java
* @author lilijun
*/
public class Gclass<T>
{
private T a;
public T getA()
{
return a;
}
public void setA(T a)
{
this.a = a;
}
}
三、泛型中有继承的概念吗?
//使用泛型
ArrayList<Integer> al2=new ArrayList<Integer>();//1
al2.add(new Integer(10));//2
Integer i2=al2.get(0);//3
ArrayList<Object> alO=al2;//这样可以吗?
如果说ArrayList<Integer> 是一个 ArrayList<Object>就可以这么转换的话将出大问题:
alO.add(new Object());将是合法的,对吧。
Integer i2=al2.get(1);//这样就会导致类型转换异常。
所以说: ArrayList<Integer> 不是一个 ArrayList<Object>.
四、无限制的类型抽象——通配符 ?
//不使用泛型的写法
public void showCollection1(Collection c)
{
System.out.println(c);
}
//使用泛型的写法。
public void showCollection2(Collection<?> c)
{
System.out.println(c);
}
五、有所限制的类型抽象
public void showCollection3(Collection<? extends Number> c)
{
for(Number n:c)
{
System.out.println(n.intValue());
}
}
六、泛型方法
//错误的写法
public void addToCollection3(Number[] a,Collection<? extends Number> c)
{
for(Number n:a)
{
c.add(n);//编译错误!
}
}
//正确的写法
public <T extends Number> void addToCollection3(T[] a,Collection<T> c)
{
for(T n:a)
{
c.add(n);
}
}
八、参考书:
《Generics in the Java Programming Language》 作者:Gilad Bracha