public <T extends Object> void thisIsT(List<T> list){

}和

public void thisIsP(List<? extends Object> list){

}
这两者有什么区别呀?

解决方案 »

  1.   

    说来话长,看链接:
    http://www.ibm.com/developerworks/cn/java/j-djc02113/
      

  2.   

    这是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){ 
    //...
      

  3.   

    说白了就是写成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());
    则不会报错
      

  4.   

    T 是一种类型。
    ?是泛指(就是通配符)List<?>  和List<Object> 是不一样的。
      

  5.   

    CollectionGenFoo <T extends Collection> 改成 CollectionGenFoo <? extends Collection>
    刚试了下,这样改会报错.
      

  6.   

    其实还有这种写法就是把这两种方法结合起来:
    看下面的这个示例:(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
      

  7.   

    第一种是固定的一种泛型,第二种是只要是Object类的子类都可以,换言之,任何类都可以,因为Object是所有类的根基类,谢谢
      

  8.   

    这样才对:
    public class CollectionGenFoo <T extends Collection<Object>>{

    public static void main(String[] args) {
    CollectionGenFoo <List<Object>> listFoo = new CollectionGenFoo <List<Object>>(); 
    }
    }
      

  9.   

    原来的代码有点错误,下面的我试了,没报错。
    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()); 
    }
    }
      

  10.   

    为什么用?就可以,用T就不可以呢?
    CollectionGenFoo  <? extends Collection> listFoo 
      

  11.   

    给出一点小小的感悟.
    刚才在不断试验过程中.我觉得,T和?的区别在于:T可以创建类的副本,而?而不可以.换而言之,T可以被实例化.而?则不可以.CollectionGenFoo  <? extends Collection> listFoo = new CollectionGenFoo  <ArrayList>(new ArrayList()); 之所以用?是表示这是个未知的类型,而最终CollectionGenFoo方法里用T,就是指定要把这个未知的类给实例化,以便用这个类中的方法或者参数.不知道我这样说对不对,欢迎各位达人指正
      

  12.   


    固定的泛型指类型是固定的,比如:Interge,String. 就是<T extends Collection><? extends Collection> 这里?代表一个未知的类型,
    但是,这个未知的类型实际上是Collection的一个子类,Collection是这个通配符的上限.
      

  13.   


    这是因为:
    <T extends Collection>其中,限定了构造此类实例的时候T是一个确定类型(具体类型),这个类型实现了Collection接口,
    但是实现 Collection接口的类很多很多,如果针对每一种都要写出具体的子类类型,那也太麻烦了,干脆还不如用
    Object通用一下。
    <? extends Collection>其中,?是一个未知类型,是一个通配符泛型,这个类型是实现Collection接口即可。
      

  14.   

    受教了,正在看<Java编程思想>,上边的泛型写的挺深入的。我是新手,看的好吃力啊
      

  15.   

    从JVM的角度看,两者也没什么区别。这些只是语言层面的概念。