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>是不一样的。

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