API中泛型有的是<T>有的是<?>这两者有什么区别吗~不都是任意类型的意思吗?求大神们解答!!!!!!!!!!!!!!!

解决方案 »

  1.   

    T是类型,?是泛指
    使用<T>来声明类型持有者名称,自定义泛型类时,类持有者名称可以使用T
    若是<?>,则是允许Object及其下的子类,也就是java的所有对象
      

  2.   

    <T>用来声明泛型,一般用在类,方法的声明中,指不确定的类型,比如:
    public class Generic <T> { ... } //这个Generic类中都可以使用T
    public <T, K> void foo {} //foo方法中可以使用T和K
    <?>不能出现在上述声明中,<?>一般出现在方法的参数列表中,比如:
    public void doStuff(List<?> list) { ... } //指参数传入的List实例可以是任何泛型
    public void doStuff1(List<? extends Number> list) { ... } //指参数传入的List实例的泛型必须是Number类的子类(包括Number类)
    上述两种方式传入方法中的list,不可以修改,如调用list.add("abc"),编译会报错
    另外还有一种如:
    public void doStuff2(List<? super Integer> list) { ... } //指参数传入的List实例的泛型必须是Integer类的父类(包括Integer类),这种情况下允许用list.add()方法添加内容。<?>还可以用在实例化的时候,如:
    List<String> list = new ArrayList<? extends String>();
      

  3.   

    LS的解释很好
    T就是指定了是什么类型,就必须用什么类型
    ?表示可以是任何类型
      

  4.   

    是不是声明集合的时候必须先确定其类型,而在下面的方法参数列表中可以使用<?>
      

  5.   

    我是这样认为的,<T>一般用在类里面,而?在声明出实例的时候,像多态那样用。
    例:
       public class Demo<T>{}
       
       Demo<?> d = new Demo();
       也可以用extends和super来限制使用泛型的范围
       Demo<? extends List> = new Demo<ArrayList>();
       Demo<? super ArrayList> = new Demo<List>();