Java泛型其實很簡單(二):泛型,繼承,子型別
阿新 • • 發佈:2021-01-05
技術標籤:Java
本系列部落格:
Java泛型其實很簡單(一):泛型類,泛型介面和泛型方法
文章目錄
1 一個常見誤區
大家都知道:如果Student
是Person
的子類,那麼我們可以將Children
的物件賦值給Father
的引用。如下:
Student s = new Student();
Person p = s; // OK.
在面向物件中,Student
和Person
的關係被稱為is-a關係(Student
is a Person
)。
因為Integer
is a Number
,Double
is a Number
,所以一下程式碼可正常編譯執行:
public void someMethod(Number n) {}
someMethod(new Integer(10)); // OK
someMethod(new Double(10.1)); // OK
接下來,我們做點改動:
public void boxTest(Box<Number> n) {}
上面這個方法,能否接受Box<Integer>
,Box<Double>
的引數型別呢?答案是:不能!
Integer
,Double
是Number
的子型別,這不代表Box<Integer>
和Box<Double>
是Box<Number>
的子型別!
2 泛型類與子型別
我們可以通過extends
或implements
來實現泛型之間的is-a關係。拿JDK中的程式碼舉例子:
ArrayList<E> implements List<E>
, List<E> extends Collection<E>
. 所以ArrayList<String>
是 List<String>
的子型別, List<String>
是Collection<String>
的子型別。如圖:
如果我們現在想要實現我們自己的List
介面,大致如下:
interface PayloadList <E,P> extends List<E> {
void setPayload(int index, P val);
}
那麼,以下型別為List<String>
的子型別:
PayloadList<String, Integer>
PayloadList<String, Double>
PayloadList<String, Exception>