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

java中的范型

2014年03月20日 ⁄ 综合 ⁄ 共 2096字 ⁄ 字号 评论关闭
 

J2SE 5.0中的最显著的变化之一是添加对泛型类型的支持,那么什么是范型,为什么要使用范型?
­
Java 语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)
­
我们把带有“参数化类型”(parameterized types)的classes 称为generic classes,把带有“参数化类型”的methods称为generic algorithms
­
1.引出问题
在java中,我们使用容器(集合)来存放对象。而由于Java拥有单根继承体系,任何Java classes都继承自java.lang.Object,因此任何对象都可以被放进各种容器。换句话说Java 容器是一种异质容器。即不同类型的对象可以存放到同一个容器中。然而有时候,而且是大半时候,我们不希望容器元素如此异质化。我们多半希望使用同质容器,即放到容器中的是同一种类型的对象,或者同一个家族的对象。
­
import java.util.*;
class GenericsTest
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add("test");
­
String t=(String)al.get(0);
}
}
­
可以看到,我们新定义了一个ArrayList集合,往集合中添加了一个元素。我们都知道,从集合中取数据的时候是通过get方法取元素,get方法返回类型是Object类型的,所以我们必须要做强制类型转换。这样的强制类型转换,就给我们的程序埋下了不安全因素,如果强制转换的类型跟放入集合中的对象类型不相同,就会抛出异常。
­
如果我们使用同质容器,就保证了容器中的对象都是同一种类型的,我么取值的时候,就可以避免一大堆转型(cast)动作,并且可以减少错,容易除错。
­
Java同质容器的语法如下,其中尖括号“<>”的用法和C++完全相同,尖括号之内的指定类型,就是同质容器的元素类型,
­
ArrayList<String> strList = new ArrayList<String>();
strList.add("zero");
strList.add("one");
strList.add("two");
strList.add("five");
System.out.println(strList); // [zero, one, two, five]
­
我们都知道,任何Java objects 都可以被放进各种容器内。但是Java 基本数值类型(primitive types,例如int, double,long, char)并不是一种class,而数值也谈不上是个object。如果要把这一类数值放进容器内,必须将容器元素声明为基本类型所对应的包装类(wrapper classes)。这实在是非常不方便。JDK1.5新增自动boxing(封箱)和un-boxing(拆箱)特性,也就是在必要时刻自动将数值转为包装对象,或将外覆物件转为数值。
­
LinkedList<Integer> iList = new LinkedList<Integer>();
iList.add(0); //boxing
iList.add(1);
iList.add(5);
iList.add(2);
int i = iList.get(2); //un-boxing
­
自定义范型
假设Stroke, Rect,Circle皆继承自Shape。如果我们希望这些classes 有足够的弹性,让用户得以在运用这些classes时才指定其内部数据(长、宽、半径等等)的类型,那就得用上泛型语法。
­
public abstract class Shape {
public abstract void draw();
}
­
public class Rect<T> extends Shape{
­
private T m_left, m_top, m_width, m_height;
­
public Rect(T left, T top, T width, T height ){
...
}
­
...
}
­
public class Circle<T> extends Shape{
­
private T m_x, m_y, m_r;
­
public Circle(T x, T y, T r){
...
}
­
...
}
­
public class Stroke<W,T> extends Shape{
­
private W m_width;
­
private ArrayList<T> m_ia;
­
public Stroke(W width, ArrayList<T> ia){
...
}
­
...
}
­
LinkedList<Shape> sList = new LinkedList<Shape>();
sList.add(new Stroke<Integer,Integer>(...));
sList.add(new Rect<Integer>(...));
sList.add(new Circle<Integer>(...));    

抱歉!评论已关闭.