泛型中T和?的区别是什么 public <T extends Object> void thisIsT(List<T> list){ }和 public void thisIsP(List<? extends Object> list){ }这两者有什么区别呀? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 说来话长,看链接:http://www.ibm.com/developerworks/cn/java/j-djc02113/ 这是jdk1.5泛型的典型应用:第一种写法,叫做使用有限制的通配符:public <T extends Object> void thisIsT(List <T> list){ //... } 当然还可以这样写:public <T> void thisIsT(List <T> list){ //... } 这两种写法效果是一样的.第二种写法,叫做泛型方法:public void thisIsP(List <? extends Object> list){ //... } 说白了就是写成T就是将类型固定,而?则不固定,比如下面这个例子public class CollectionGenFoo<T extends Collection> {...}这么写就会报错CollectionGenFoo<Collection> listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());如果把 CollectionGenFoo<T extends Collection> 改成 CollectionGenFoo<? extends Collection>的话CollectionGenFoo<Collection> listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());则不会报错 T 是一种类型。?是泛指(就是通配符)List<?> 和List<Object> 是不一样的。 CollectionGenFoo <T extends Collection> 改成 CollectionGenFoo <? extends Collection>刚试了下,这样改会报错. 其实还有这种写法就是把这两种方法结合起来:看下面的这个示例:(Collections.copy())class Collections { public static <T> void copy(List<T> dest, List<? extends T> src){...}}仔细观察上面的这个方法,既使用了有限制的通配符(?),又使用了泛型方法.这两种泛型使用方法的主要区别就是:泛型函数(这里指copy()这个方法)允许类型参数(Type Parameters)被用来表示方法的一个或多个参数之间的关系,或者参数与其返回值之间的关系.如果没有这样的依赖关系,不应该使用泛型方法.在这里和大家共同学习了,更多请参考:http://blog.csdn.net/great1681/archive/2009/04/08/4057025.aspx 第一种是固定的一种泛型,第二种是只要是Object类的子类都可以,换言之,任何类都可以,因为Object是所有类的根基类,谢谢 这样才对:public class CollectionGenFoo <T extends Collection<Object>>{ public static void main(String[] args) { CollectionGenFoo <List<Object>> listFoo = new CollectionGenFoo <List<Object>>(); }} 原来的代码有点错误,下面的我试了,没报错。import java.util.*;class CollectionGenFoo <T extends Collection> { private T x; public CollectionGenFoo(T x) { this.x = x; }} public class TestGeneric{ public static void main(String[] args) { CollectionGenFoo <? extends Collection> listFoo = new CollectionGenFoo <ArrayList>(new ArrayList()); }} 为什么用?就可以,用T就不可以呢?CollectionGenFoo <? extends Collection> listFoo 给出一点小小的感悟.刚才在不断试验过程中.我觉得,T和?的区别在于:T可以创建类的副本,而?而不可以.换而言之,T可以被实例化.而?则不可以.CollectionGenFoo <? extends Collection> listFoo = new CollectionGenFoo <ArrayList>(new ArrayList()); 之所以用?是表示这是个未知的类型,而最终CollectionGenFoo方法里用T,就是指定要把这个未知的类给实例化,以便用这个类中的方法或者参数.不知道我这样说对不对,欢迎各位达人指正 固定的泛型指类型是固定的,比如:Interge,String. 就是<T extends Collection><? extends Collection> 这里?代表一个未知的类型,但是,这个未知的类型实际上是Collection的一个子类,Collection是这个通配符的上限. 这是因为:<T extends Collection>其中,限定了构造此类实例的时候T是一个确定类型(具体类型),这个类型实现了Collection接口,但是实现 Collection接口的类很多很多,如果针对每一种都要写出具体的子类类型,那也太麻烦了,干脆还不如用Object通用一下。<? extends Collection>其中,?是一个未知类型,是一个通配符泛型,这个类型是实现Collection接口即可。 受教了,正在看<Java编程思想>,上边的泛型写的挺深入的。我是新手,看的好吃力啊 从JVM的角度看,两者也没什么区别。这些只是语言层面的概念。 征题 如何才能保证只打开一个JFrame窗口? JavaDBF有谁用过啊。有问题了!!! 如果将来我的工作涉及到控制机床或者是PLC方面的编程,那么使用VC还是JAVA好,我有C++的基础. java中的drawimage方法? 一个简单的数组查询,为什么不好用 各位,我得了JAVA综合“症”。救命啊!!!! 谁能提供在载Eclipse的准确地址 jbuilder5的怪问题,气死我了! java 与 C++ 实现后绑定的方法 list中如何判断相同值的个数? 如何控制JOptionPane的按钮
http://www.ibm.com/developerworks/cn/java/j-djc02113/
第一种写法,叫做使用有限制的通配符:
public <T extends Object> void thisIsT(List <T> list){
//...
}
当然还可以这样写:
public <T> void thisIsT(List <T> list){
//...
}
这两种写法效果是一样的.第二种写法,叫做泛型方法:
public void thisIsP(List <? extends Object> list){
//...
}
public class CollectionGenFoo<T extends Collection> {
...
}这么写就会报错
CollectionGenFoo<Collection> listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());如果把 CollectionGenFoo<T extends Collection> 改成 CollectionGenFoo<? extends Collection>的话
CollectionGenFoo<Collection> listFoo = new CollectionGenFoo<ArrayList>(new ArrayList());
则不会报错
?是泛指(就是通配符)List<?> 和List<Object> 是不一样的。
刚试了下,这样改会报错.
看下面的这个示例:(Collections.copy())
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src){...}}
仔细观察上面的这个方法,既使用了有限制的通配符(?),
又使用了泛型方法.这两种泛型使用方法的主要区别就是:
泛型函数(这里指copy()这个方法)允许类型参数(Type Parameters)被用来表示方法的一个或多个参数之间的关系,或者
参数与其返回值之间的关系.如果没有这样的依赖关系,不应该使用泛型方法.
在这里和大家共同学习了,更多请参考:
http://blog.csdn.net/great1681/archive/2009/04/08/4057025.aspx
public class CollectionGenFoo <T extends Collection<Object>>{
public static void main(String[] args) {
CollectionGenFoo <List<Object>> listFoo = new CollectionGenFoo <List<Object>>();
}
}
import java.util.*;class CollectionGenFoo <T extends Collection> {
private T x;
public CollectionGenFoo(T x) {
this.x = x;
}
} public class TestGeneric
{
public static void main(String[] args)
{
CollectionGenFoo <? extends Collection> listFoo = new CollectionGenFoo <ArrayList>(new ArrayList());
}
}
CollectionGenFoo <? extends Collection> listFoo
刚才在不断试验过程中.我觉得,T和?的区别在于:T可以创建类的副本,而?而不可以.换而言之,T可以被实例化.而?则不可以.CollectionGenFoo <? extends Collection> listFoo = new CollectionGenFoo <ArrayList>(new ArrayList()); 之所以用?是表示这是个未知的类型,而最终CollectionGenFoo方法里用T,就是指定要把这个未知的类给实例化,以便用这个类中的方法或者参数.不知道我这样说对不对,欢迎各位达人指正
固定的泛型指类型是固定的,比如:Interge,String. 就是<T extends Collection><? extends Collection> 这里?代表一个未知的类型,
但是,这个未知的类型实际上是Collection的一个子类,Collection是这个通配符的上限.
这是因为:
<T extends Collection>其中,限定了构造此类实例的时候T是一个确定类型(具体类型),这个类型实现了Collection接口,
但是实现 Collection接口的类很多很多,如果针对每一种都要写出具体的子类类型,那也太麻烦了,干脆还不如用
Object通用一下。
<? extends Collection>其中,?是一个未知类型,是一个通配符泛型,这个类型是实现Collection接口即可。