?與extends與super
泛型類型沒有多型
不能像類別多型一樣,等號=左邊是父類別,等號=右邊是指向子類別。
以下的語法,不能編譯通過,即便String是Object的子類別。
1
List<Object> list = new ArrayList<String>();
? extends
泛型類型只能是Number或Number的子類別。
1
< ? extends Number>
下圖中,只有Boolean與Character沒有在Number下。
範例程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(4);
printNumberList(list);
ArrayList<Character> charlist = new ArrayList<>();
// 以下編譯不過,因為Character不是Number子類
printNumberList(charlist);
}
// 參數泛型類型只能是Number或Number的子類別
public static void printNumberList(List<? extends Number> list) {
for (Number number : list) {
System.out.println(number);
}
}
5
4
? supper
泛型類型只能是Integer或Integer父類別。
1
< ? supper Integer>
範例程式碼
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
27
28
public class Test1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(4);
// 以下編譯不過,因為Integer不是Character,也不是Character父類別。
printParent(list);
ArrayList<Character> charlist = new ArrayList<>();
printParent(charlist);
ArrayList<Object> objlist = new ArrayList<>();
printParent(objlist);
}
// 參數泛型類型只能是Number或Number的子類別
public static void printNumberList(List<? extends Number> list) {
for (Number number : list) {
System.out.println(number);
}
}
// 參數泛型類型只能是Character或Character父類別
public static void printParent(List<? super Character> list) {
for (Object o : list) {
System.out.println(o);
}
}
}
? 任何類型
?代表泛型類型可以是任何類型。
1
< ? >
不管任何類型的list都可以使用printAnyType()方法。
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
27
28
29
30
31
32
33
34
35
public class Test1 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(5);
list.add(4);
printAnyType(list);
ArrayList<Character> charlist = new ArrayList<>();
printAnyType(charlist);
ArrayList<Object> objlist = new ArrayList<>();
printAnyType(objlist);
}
// 參數泛型類型只能是Number或Number的子類別
public static void printNumberList(List<? extends Number> list) {
for (Number number : list) {
System.out.println(number);
}
}
// 參數泛型類型只能是Character或Character父類別
public static void printParent(List<? super Character> list) {
for (Object o : list) {
System.out.println(o);
}
}
// 參數泛型類型可以是任何類型
public static void printAnyType(List<?> list) {
for (Object o : list) {
System.out.println(o);
}
}
}