Java中泛型<?> 問號的作用

這是jdk1.5泛型的典型應用:
第一種寫法,叫做使用泛型方法:

public<TextendsObject>voidthisIsT(List<T>list){
//...
}

當然還可以這樣寫:

public<T>voidthisIsT(List<T>list){
//...
}

這兩種寫法效果是一樣的.
第二種寫法,叫做有限制的通配符:

publicvoidthisIsP(List<?extendsObject>list){
//...
}

其實還有這種寫法就是把這兩種方法結合起來:
看下面的這個示例:(Collections.copy())

classCollections{
publicstatic<T>voidcopy(List<T>dest,List<?extendsT>src){...}
}

仔細觀察上面的這個方法,既使用了有限制的通配符(?),
又使用了泛型方法.
這兩種泛型使用方法的主要區別就是:
泛型函數(這裏指copy()這個方法)允許類型參數(TypeParameters)被用來表示方法的一個或多個參數之間的關係,或者
參數與其返回值之間的關係.如果沒有這樣的依賴關係,不應該使用泛型方法.

在這裏和大家共同學習了,更多請參考:


說白了就是寫成T就是將類型固定,而?則不固定,比如下面這個例子
publicclassCollectionGenFoo<TextendsCollection>{
...
}
這麼寫就會報錯
CollectionGenFoo<Collection>listFoo=newCollectionGenFoo<ArrayList>(newArrayList());

如果把CollectionGenFoo<TextendsCollection>改成CollectionGenFoo<?extendsCollection>的話
CollectionGenFoo<Collection>listFoo=newCollectionGenFoo<ArrayList>(newArrayList());
則不會報錯。


T是一種類型。
?是泛指(就是通配符)
List<?>和List<Object>是不一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章