最近在學習 generic 的知識,看到 wildcard 有一些疑問,
假設我們有一個這樣的 Class
class Node<T> {
T data;
public Node(T data) {
this.data = data
}
public voide setData(T data) {
this.data = data;
}
}
在 Java 中包含 type variable 的 class 是沒有關係的,即便兩個 type variables
有繼承關係。
例如:
List<Number> numList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
numList = intList // compile error
但是 Java 為了增加一些使用上的彈性,增加了一些語法使得開發者們可以在一些限制下
做到上面的操作,就是使用 wildcard type:
List<? extends Number> numList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
numList = intList // ok!
不過這樣的用法是一些有限制的,像是我們沒有辦法增加元素到 numList 裡面
numList.add(1) // compile error
這也是使用 wildcard type 時需要注意到的 PECS 原則
(剩下的就不再贅述,這邊只是讓版友知道我對這個主題目前的理解)