3 回答

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
如果要對(duì)不同類型的方法參數(shù)強(qiáng)制執(zhí)行某種關(guān)系,則不能使用通配符,必須使用類型參數(shù)。
src
dest
copy()
public static <T extends Number> void copy(List<T> dest, List<T> src)
dest
src
List
src
dest
.
public static void copy(List<? extends Number> dest, List<? extends Number> src)
List<Integer>
List<Float>
dest
src
src
dest
如果只有一個(gè)參數(shù)化類型參數(shù),則可以使用通配符,盡管類型參數(shù)也會(huì)工作。 類型參數(shù)支持多個(gè)邊界,通配符不支持。 通配符支持上下界,類型參數(shù)只支持上界。因此,如果您想要定義一個(gè)采用 List
類型 Integer
或者是超級(jí)班,你可以: public void print(List<? super Integer> list) // OK
但是不能使用類型參數(shù): public <T super Integer> void print(List<T> list) // Won't compile
參考資料:

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
public static <T1, T2 extends T1> void merge(SinglyLinkQueue<T1> d, SinglyLinkQueue<T2> s){ // merge s element into d}public static <T> void merge(SinglyLinkQueue<T> d, SinglyLinkQueue<? extends T> s){ // merge s element into d}
“一般規(guī)則是在可能時(shí)使用通配符,因?yàn)橥ㄅ浞a通常比具有多個(gè)類型參數(shù)的代碼更具可讀性。在決定是否需要類型變量時(shí),問(wèn)問(wèn)自己該類型變量是否用于關(guān)聯(lián)兩個(gè)或多個(gè)參數(shù),還是將參數(shù)類型與返回類型相關(guān)聯(lián)。如果答案是否定的,那么通配符就足夠了?!?/strong>

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
public <T> T giveMeMaximum(Collection<T> items);public <T> Collection<T> applyFilter(Collection<T> items);
Long
Long
Collection<Long>
public int count(Collection<?> items);public boolean containsDuplicate(Collection<?> items);
int
boolean
.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c);}
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ...}
List<? extends T> src
interface Fruit{}
class Apple implements Fruit{}class Pear implements Fruit{}class Tomato implements Fruit{}
List<? extends Fruit> basket = new ArrayList<? extends Fruit>();basket.add(new Apple());basket.add(new Pear()); basket.add(new Tomato());List<Fruit> fridge = new ArrayList<Fruit>(); Collections.copy(fridge, basket);// works
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ...}
List<S> src
List<Apple> basket = new ArrayList<Apple>();basket.add(new Apple());basket.add(new Apple());basket.add(new Apple()); List<Fruit> fridge = new ArrayList<Fruit>();Collections.copy(fridge, basket); /* works since the basket is defined as a List of apples and not a list of some fruits. */
添加回答
舉報(bào)