一、泛型的概念
Java标准库提供的ArrayList类,假设我们自己来实现这个类。如果用ArrayList存储String类型,那么会安排以下属性与方法:
1 2 3 4 5 6 7
| public class MyArrayList{ private String[] array; private int size; public void add(String a){...} public void remove(int index){...} public String get(int index){...} }
|
这样存入的必须是String,取出的也一定是String
为了解决这种单一性,我们将代码修改为如下这种模板:
1 2 3 4 5 6 7
| public class MyArrayList<T>{ private T[] array; private int size; public void add(T a){...} public void remove(int index){...} public T get(int index){...} }
|
其中T可以是任何类型,从而达到了一个模板满足多种子类型的目的,这就是泛型。
二、向上转型的问题
就像可以使用一个类的父类的引用类型来引用这个类,实现了泛型的类也可以用其父类的引用类型来引用这个类,例如可以用List来引用ArrayList。
但是不能用List来引用ArrayList。因为假设把ArrayList转型为ArrayLIst后,就可以接受Float类型,而ArrayList不能接受Float类型,故会产生报错。因此,编译器不允许把ArrayList转型为ArrayLIst。
另外,一个类可以继承一个泛型类。例如:public class IntPair extends Pair{…}
三、静态方法中的泛型
编写泛型类时,要特别注意,泛型类不能用于静态方法。例如
1 2 3 4 5
| public class Pair<T>{ private T first; private T last;
public static Pair<T> create(T first,T last){...}
|
这样的代码会导致编译错误。稍作修改可以编译通过:
1 2
| public static <T> Pair<T> create(T first,T last){...}
|
但实际上,这个和Pair类型的已经没有任何关系了,而是另一类独立的泛型,我们应该对它做区分处理:
1 2
| public static <K> Pair<K> create(K first,K last){...}
|
四、总结
使用泛型可以提升其可移植性与可复用性,带来更高的效率
同时可以提高java程序的类型安全