Java泛型总结
1、概念
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
2、泛型优点
Java语言中引入泛型的好处是安全简单。可以将运行时错误提前到编译时错误。泛型的主要目的之一就是用来指定容器要持有什么类型的的对象,而且由编译器来保证类型的正确性。
在没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
3、泛型在使用中还有一些规则和限制
1)泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2)同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3)泛型的类型参数可以有多个。
4)泛型的参数类型可以使用extends语句,例如。习惯上成为“有界类型”。
5)不能直接new一个泛型数组,如arr = new T[10]。
6)构造方法中不加泛型参数。
7)不能new一个泛型对象,如new T()
4、泛型类
一个泛型类就是具有一个或多个类型变量的类。定义一个泛型类就是在类名后面加上<>,再在里面加上类型参数代替以前的Object,比如下面以T为例:
class Pair<T> {
private T value;
public Pair(T value) {
this.value=value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
5、泛型接口
定义泛型接口和泛型类差不多,一般来说,如果一个类实现了一个泛型接口,那么该类也必须是泛型的。看下面简单的例子:
interface Show<T,U>{
void show(T t,U u);
}
class ShowTest implements Show<String,Date>{
@Override
public void show(String str,Date date) {
System.out.println(str);
System.out.println(date);
}
}
测试:
public static void main(String[] args) throws ClassNotFoundException {
ShowTest showTest=new ShowTest();
showTest.show("Hello",new Date());
6、泛型方法
常见的泛型都是用到整个类上,但其实可以在类中包含参数化方法,而且这个方法所在的类可以是泛型类,也可以不是泛型类。也就是说是否拥有泛型方法,与其所在的类是否是泛型类没有关系。定义泛型方法时,必须在返回值前边加一个,来声明这是一个泛型方法,持有一个泛型T,然后才可以用泛型T作为方法的返回值。
使用泛型方法,要传递方法的形式类型参数的实际类型参数,我们必须在方法调用中的点和方法名之间的尖括号<>中指定它。
class MyBag<T> {
private T value;
public MyBag(T value) {
this.value = value;
}
public T get() {
return value;
}
public void set(T a) {
this.value = a;
}
}
class Test<T> {
public <V> void m1(MyBag<V> a, MyBag<V> b, T c) {
}
}
public class Main {
public static void main(String[] argv) {
Test<String> t = new Test<String>();
MyBag<Integer> w1 = new MyBag<Integer>(new Integer(201));
MyBag<Integer> w2 = new MyBag<Integer>(new Integer(202));
// Specify that Integer is the actual type for the type parameter for m1()
t.<Integer>m1(w1, w2, "hello");
t.m1(w1, w2, "hello");
}
}