Java Generic Types

添加评论 3 views 2010年1月26日

泛型(Generic Types)是java5.0 的新特性,是JAVA 的又一次革命。

它的特点:
JVM 不变,JAVA 和 C++不断的融合, 5.0 里有许多和 C++ 类似。留下的只是思想。 程序员的开发工作越来越简单。
泛型增强了java的类型安全,可以在编译期间对容器内的对象进行类型检查,在运行 期不必进行类型的转换。而在j2se5 之前必须在运行期动态进行容器内对象的检 查及转换,泛型是编译时概念,运行时没有泛型
泛型减少含糊的容器,可以定义什么类型的数据放入容器。
一个例子:
ArrayList aList = new ArrayList();
aList.add(new Integer(1));
// …
Integer myInteger = aList.get(0);

我们可以看到,在这个简单的例子中,我们在定义 aList 的时候指明了它是一个 直接受 Integer 类型的 ArrayList,当我们调用 aList.get(0)时,我们已经不再需要 先显式的将结果转换成 Integer,然后再赋值给 myInteger 了。而这一步在早先的 Java 版本中是必须的。也许你在想,在使用 Collection 时节约一些类型转换就是 Java 泛型的全部吗?远不止。单就这个例子而言,泛型至少还有一个更大的好处, 那就是使用了泛型的容器类变得更加健壮:早先,Collection 接口的 get()和 Iterator 接口的 next()方法都只能返回 Object 类型的结果,我们可以把这个结果强制转换 成任何 Object 的子类,而不会有任何编译期的错误,但这显然很可能带来严重 的运行期错误,因为在代码中确定从某个 Collection 中取出的是什么类型的对象 完全是调用者自己说了算,而调用者也许并不清楚放进 Collection 的对象具体是 什么类的;就算知道放进去的对象“应该”是什么类,也不能保证放到 Collection的对象就一定是那个类的实例。现在有了泛型,只要我们定义的时候指明该Collection 接受哪种类型的对象,编译器可以帮我们避免类似的问题溜到产品中。

声明及实例化泛型类:
HashMap hm = new HashMap(); 编译类型的泛型和运行时类型的泛型一定要一致。没有多态。 不能使用原始类型
GenList nList = new GenList(); //编译错误
J2SE 5.0 目前不支持原始类型作为类型参数(type parameter)
定义泛型接口:
public interface GenInterface {
void func(T t);
}
定义泛型类
public class ArrayList { … }
public class GenMap { … }

类的静态方法不能使用泛型,因为泛型类是在创建对象的时候产生的。

泛型通配符
List<? extends Object> 往下匹配
List<? super Number> 往下上匹配

泛型的一些局限性
不能实例化泛型
T t = new T(); //error
不能实例化泛型类型的数组
T[] ts= new T[10]; //编译错误 不能实例化泛型参数数
Pair[] table = new Pair(10); // ERROR
类的静态变量不能声明为类型参数类型
public class GenClass {
private static T t; //编译错误

}
泛型类不能继承自 Throwable 以及其子类
public GenExpection extends Exception{} //编译错误 不能用于基础类型 int 等
Pair //error
不同泛型间不能相互赋值,没有多态
泛型类型不可以被“重载”;也就是说,和普通类型一样在一个作用域内,泛型类型必须被唯一地命名。

  1. 还没有评论.想坐沙发?
  1. 还没有 trackbacks
订阅评论