软件构造笔记————泛型

First Post:

Last Update:

Word Count:
547

Read Time:
2 min

一、泛型的概念

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;
//对静态方法使用<T>:
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程序的类型安全