Java泛型总结

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 {
	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{
	void show(T t,U u);
}
 
class ShowTest implements Show{
	@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 {
  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 {
  public  void m1(MyBag a, MyBag b, T c) {
  }
}
public class Main {
  public static void main(String[] argv) {
    Test t = new Test();
    MyBag w1 = new MyBag(new Integer(201));
    MyBag w2 = new MyBag(new Integer(202));
    // Specify that Integer is the actual type for the type parameter for m1()
    t.m1(w1, w2, "hello");
    t.m1(w1, w2, "hello");
  }
}

你可能感兴趣的:(Java泛型总结)