大多數時候可以使用泛型方法來代替類型通配符.例如
package com.j1803;
public interface Collection<E> {
boolean containAll(Collection<E> C);
boolean addAll(Collection<? extends E> C);
}
//可以改寫成
public interface Collection {
<T> boolean containAll(Collection<T> C);
<T> boolean addAll(Collection<T> c);
}
上面方法使用了<T extends E>泛型形式,這時定義泛型形參時設定上限(其中E是Collection接口)里定義的泛型,在該接口里E可以當成普通類型).
上面的兩個方法中泛型E只使用一次,泛型形參T產生的唯一效果是可以在不同的調用點傳入不同的實際類型.對於這種情況,應該使用通配符:通配符就是被設計用來支持靈活的子變化的.
泛型方法允許泛型形參被用來表示方法的一個或者多個參數之間的類型依賴關系,或者方法返回值與參數之間的類型依賴關系.如果沒有這種類型依賴關系,就不應該使用泛型方法.
如果某個方法中一個形參(a)的類型或者返回值的類型依賴於另一個形參(b)的類型,則形參(b)的類型聲明不應該使用通配符,因為形參(a)或返回值的類型依賴於該形參(b)的類型,如果(b)的類型無法確定,程序就無法定義
形參(a)的類型,在這種情況下,只能考慮使用在方法簽名中聲明泛型也就是泛型方法.
類型通配符與泛型方法(在方法簽名中顯示聲明泛型形參)還有一個顯著的區別:類型通配符既可以在方法簽名總定義形參的類型,也可以用於定義變量的類型;但是泛型方法中的泛型形參必須在對應方法中顯示聲明.