JAVA泛型的学习(1)
1.什么是泛型?
泛型(generic)可以参数化类型,使我们在定义带泛型类型的类或方法时,随后编译器会用具体的类型来替换它。
个人感觉与C++的模板很像。
2.为什么要用到泛型
使用泛型的动机就是可以在编译时检测出错误,使程序更加可靠,这么说可能没什么感觉,下面举个具体的小例子:
JDK1.5以前的Comparable接口:
package java.lang
public interface Comparable {
public int compareTo(Object o)
}
Comparable comparable = new Date();
System.out.println(comparable.compareTo("red"));
由于compareTo()方法接受的参数类型是Object类型,所以给它传一个String类型的参数,在编译阶段不会有问题,只有当程序在运行时,才会发现Date类型与String类型无法比较。而使用了泛型就不同了——
JDK1.5以后的Comparable接口:
package java.lang
public interface Comparable<T> {
public int compareTo(T o)
}
Comparable<Date> comparable = new Date();
System.out.println(comparable.compareTo("red"));
运用了泛型在实际编写时,程序员指明了compareTo()方法接受的参数为Date类型,在编译时发现它是String类型时就会编译通不过。
3.泛型可以用来干什么
定义泛型类和接口(如下定义一个泛型类的示例)
public class GenericStack<E> {
private ArrayList<E> list = new ArrayList<>();
public E peek() {
return list.get(getSize() - 1);
}
public int getSize() {
return list.size();
}
、、、
}
注意:GenericStack的构造方法应该被定义为public GenericStack()
有时,泛型类会有多个参数,用<E1,E2,E3>表示
可以定义一个类或接口作为泛型类或者泛型接口的子类型。例如,在JavaAPI中,java.lang.String 类被定义为实现Comparable接口,public class String implements Comparable<String>
定义泛型方法
public static <E> void print(E[] list) {
for(int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
}