1. 程式人生 > 其它 >Java泛型其實很簡單(二):泛型,繼承,子型別

Java泛型其實很簡單(二):泛型,繼承,子型別

技術標籤:Java

本系列部落格:
Java泛型其實很簡單(一):泛型類,泛型介面和泛型方法

文章目錄

1 一個常見誤區

大家都知道:如果StudentPerson的子類,那麼我們可以將Children的物件賦值給Father的引用。如下:

Student s = new Student();
Person p = s; // OK.

在面向物件中,StudentPerson的關係被稱為is-a關係(Studentis a Person)。
因為Integeris a NumberDoubleis 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>的引數型別呢?答案是:不能!
IntegerDoubleNumber的子型別,這不代表Box<Integer>Box<Double>Box<Number>

的子型別
在這裡插入圖片描述

2 泛型類與子型別

我們可以通過extendsimplements來實現泛型之間的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>

在這裡插入圖片描述