天天看點

使用通配符和泛型:完成父子類關系的List對象的類型比對

使用泛型和通配符都可以讓一個方法所表示的算法邏輯适應多種類型。

Java中具備繼承關系的類A、B(`A extends B`)它們的集合`List`和`List`之間是沒有繼承關系的,

可以使用泛型或通配符來讓一個方法支援同時接受`List`和`List`。

Java中具備繼承關系的類A、B(<code>A extends B</code>)它們的集合<code>List&lt;A&gt;</code>和<code>List&lt;B&gt;</code>之間是沒有繼承關系的,

可以使用泛型或通配符來讓一個方法支援同時接受<code>List&lt;A&gt;</code>和<code>List&lt;B&gt;</code>。

這裡分别定義類Animal、Dog和Cat,很顯然,Dog和Cat是Animal的子類。

它們的簡單定義如下:

上面Animal類定義了<code>boolean afraidOf(Animal other)</code>方法,表示一個動物是否害怕另一個動物。

可以看到Cat和Dog有着不同的表現。

假設有下面需求:

從一個<code>List&lt;Animal&gt;</code>中找到某個Animal對象害怕的所有其它動物。

對應有以下的API方法:

如果這時有<code>List&lt;Dog&gt;</code>或者<code>List&lt;Cat&gt;</code>這種,也應該是支援的。

可以通過通配符或者泛型方法實作。

使用<code>List&lt;? extends Animal&gt;</code>這樣的形參,就可以接收集合項為Animal子類的任意List。

這時就可以這樣調用了:

其他Animal子類的List都是可以的。

抛開實際意義,假設需要findScaredAnimals()中,傳回值和參數對應的具體Animal子類型是一緻的,那麼就需要用到泛型了:

可以看到,泛型類型參數T同時限制了多個地方。

泛型參數也可以是多個的,而且之間存在關系。

以上通過一個不太實際的案例說明了使用泛型和通配符來解決List泛型集合之間的“比對”問題。這也是它們的主要用途之一。

(本文使用Atom編寫)