Java 泛型学习笔记

大部分都和C++中一样,主要注意泛型和多态相关的一部分内容

泛型与多态

泛型不具备继承性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.ArrayList;

public class GenericsDemo {
public static void main(String[] args) {
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();


method(list1);
method(list2);//error
method(list3);//error
}

public static void method(ArrayList<Ye> list){

}
}


class Ye{};
class Fu extends Ye{};
class Zi extends Fu{};

泛型里面是什么,就得传什么

数据具有继承性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.ArrayList;

public class GenericsDemo {
public static void main(String[] args) {
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();


// method(list1);
// method(list2);//error
// method(list3);//error
list1.add(new Ye());
list1.add(new Fu());
list1.add(new Zi());
}

public static void method(ArrayList<Ye> list){

}
}


class Ye{};
class Fu extends Ye{};
class Zi extends Fu{};

这样是可以的

泛型方法

1
2
3
public static<E> void method(ArrayList<E> list) {

}

在修饰符后面加入泛型,可以生成泛型方法

弊端:可以接受任意的数据类型

通配符限定范围

  • ?:表示不确定的类型,可以放在泛型里面

例如:

1
2
3
public static void method(ArrayList<?> list) {
//此时不用在修饰符后面显式标注泛型
}
  • ? extends E:表示可以传递E或者E所有的子类类型
  • ? super E:表示可以传递E或者E所有的父类类型

应用场景

  • 在定义类、方法、接口的时候,如果类型不确定,就可以定义泛型类、泛型方法、泛型接口
  • 如果类型不确定,但是之后只能传递某个继承体系里面的,可以使用泛型的通配符
img_show