generics-泛型

泛型使用

只能使用对象,不能用基本数据类型

泛型无多态,但数据有多态

泛型类

写在类后面

HashMap:

1
2
3
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V> {
...
}

泛型接口

1
public interface List<E> extends ......

泛型方法

写在返回值前:

1
2
3
4

public static <E, T> List<T> convertListToList(List<E> input, Class<T> clzz) {
// 方法体
}

使用可变参数:

1
public <A> void argsMethod(A ... args)

创建泛型实例

1
2
3
4
5
// JDK7 之前的写法:
ArrayList<String> list = new ArrayList<String>();

// JDK7 以及之后:
ArrayList<String> list = new ArrayList<>();

泛型的通配符和上下界

泛型标记符

运行时没有区别,只是名字不同

常见的约定:

E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)

泛型通配符 ?

表示类型不确定,配合上下界使用

  • 通配符 ? 不能用在泛型的实例化中:
1
void print(List<?> list)

上界下界

闭区间

上界: extends:
表示泛型最高类型是 Animal ,只能是它或它的子类

1
Coll<? extends Animal> 

下界 super:
表示泛型最低类型是 Dog 。只能是它或它的父类

1
Coll<? super Dog> 

泛型擦除

泛型只在编译时起作用,运行时泛型还是被当成 Object 来处理

泛型的参数 E 运行时是 Object 类型