【笔记】Java的泛型

前言

Java的泛型

定义类时使用泛型

  • 在类名后通过<>定义泛型
  • 泛型又被称为类型参数
1
2
3
4
5
6
7
8
class Cls<T> {

T t;

Cls(T t) {
this.t = t;
}
}

定义多个

1
2
3
4
5
6
7
8
9
10
class Cls<T, S> {

T t;
S s;

Cls(T t, S s) {
this.t = t;
this.s = s;
}
}

创建对象时指定类型

1
2
Cls<String> cls = new Cls<String>("");
String str = cls.t;

通过钻石运算符自动推导类型

1
2
Cls<String> cls = new Cls<>("");
String str = cls.t;

指定匹配所有类型

1
2
Cls<?> cls = new Cls<>("");
Object str = cls.t;

定义方法时指定泛型

  • 在返回值类型前通过<>定义泛型
1
2
3
<T> T method(T t) {
...
}

抽象类使用泛型

继承抽象类时使用泛型

1
2
3
4
5
6
7
8
9
10
abstract class Father<T> {
abstract T method(T t);
}

class Son extends Father<String> {
@Override
String method(String s) {
...
}
}

将抽象类的泛型继承下来

1
2
3
4
5
6
7
8
9
10
abstract class Father<T> {
abstract T method(T t);
}

class Son<S> extends Father<T> {
@Override
SS method(S s) {
...
}
}

接口使用泛型

实现接口时使用泛型

1
2
3
4
5
6
7
8
9
10
interface Father<T> {
T method(T t);
}

class Son implements Father<String> {
@Override
String method(String s) {
...
}
}

将接口的泛型继承下来

1
2
3
4
5
6
7
8
9
10
interface Father<T> {
T method(T t);
}

class Son<S> implements Father<T> {
@Override
S method(S s) {
...
}
}

限制泛型界限

  • 限制泛型界限又被称为有界类型参数

上界

  • 通过extends关键字限制泛型只能是指定类及其子类
  • extends可以用于通配符,也可以用于类型参数

定义类时使用泛型

1
class Cls<T extends Father> {}

创建对象时指定泛型

1
Cls<? extends Father> cls = new Cls<>();

定义方法时使用泛型

1
2
3
<T extends Father> T method(T t) {
...
}

下界

  • 通过super关键字限制泛型只能是指定类及其父类
  • super只能用于通配符,不能用于类型参数

创建对象时指定泛型

1
Cls<? super Son> cls = new Cls<>();

完成

参考文献

哔哩哔哩——青空の霞光