Java-泛型

一个变量可能会需要有多种类型, 一个处理方法是将其定义成Object类, 用强制类型转换解决。

但是可能会有非法的转换行为出现, 不会在编译阶段报错, 而会在程序运行时出错。

通过泛型可以在编译阶段禁止非法的强制类型转换, 提高安全性, 其本质仍是Object类的强制类型转换。

泛型类定义

一般后面的构造方法的钻石通配符内内容可以省略。

1
2
3
4
5
6
7
8
9
10
public class Score<T> {
T score;
public Score(T score) {
this.score = score;
}

public static void main(String[] args) {
Score<String> s = new Score<>("100分");
}
}

泛型的处理是在编译器层面。 编译器将泛型的使用转换成强制类型转换的方法。

T 是一个Object类, 通过强制类型转换来实现泛型类。

泛型方法

静态泛型方法定义:

1
2
3
public static <T> test(T x) {

}

泛型用于接口

定义与定义泛型类类似。

使用有两种。 一种是接口实现具体类型, 一种为泛型类继承泛型接口。

1
2
3
public class Score implements ScoreInterface<String> {

}
1
2
3
public class Score<T> implements ScoreInterface<T> {

}

其他局限和特点

不能用于基本类型

泛型本质是Object类的强制类型转换, 是针对对象, 而不是基本类型。

只能用于非静态成员

在实际创建对象前泛型的类型是不确定的, 因此不能定义为静态成员。

? 通配符

匹配任意类型, 默认类型为Object

上下界

extendssuper 来设定上下界。

1
Score<? super Integer> s = new Score<Number>();

设定上界后 ? 通配符为上界类型。

设定下界后 ? 通配符仍为Object类。