import java.util.*;public class UseCase3 <T>{
public void doSomething(UseCase3<? extends List> a){
System.out.println(a.getClass().getName());
}
public void print(T t){
System.out.println(t.getClass().getName());
} public static void main(String[] args) {
// TODO 自动生成方法存根
UseCase3<? extends List> a=new UseCase3<ArrayList>();
a.doSomething(new UseCase3<ArrayList>());
a.doSomething(new UseCase3<LinkedList>());
a.print(new UseCase3<ArrayList>());
UseCase3<Object> a2=new UseCase3<Object>();
a2.print(a2);

}
}请问下这句a.print(new UseCase3<ArrayList>());为什么报错?print方法的参数,对类型并没有限定呀泛型通配符

解决方案 »

  1.   

    UseCase3<? extends List> a=new UseCase3<ArrayList>();
    这里限制了,不要这么向上转型
    因为如果类型参数是? extends List的话,系统无法验证任何一个类是否是安全的
    要用的就用<? super ArrayList> 这样的话,系统至少知道new ArrayList()一定是安全的
      

  2.   

    1楼的同学,我刚学泛型,你说的我不太理解。T t不是可以接受任何类型嘛,为什么不安全的?UseCase3<? extends List> a=new UseCase3<ArrayList>();这里的限定,我是想测试下doSomething方法的。能详细给我说说吗
      

  3.   

    public class UseCase3 <T>{
    public void doSomething(UseCase3<? extends List> a){
    System.out.println(a.getClass().getName());
    }
    public void print(T t){
    System.out.println(t.getClass().getName());
    } T 是接受实例化的时候的 new UseCase3<? extends List>();
    也就是说 T代表的是继承List的任意类。
    所以print(? extends List)参数也必须是List的子类。
      

  4.   

    楼主打扰了。继承我用的不熟。sorry
      

  5.   

    UseCase3<? extends List> a=new UseCase3<ArrayList>();
    这个时候a.print方法实际上是public void print(? extends List t){
    System.out.println(t.getClass().getName());
    }它是无法接受任何参数的
      

  6.   

    有点不懂,想问下6楼   (? extends List t)不是限定T只能是继承了List的类嘛。那为什么a.print(new ArrayList());这句也不正确呢
      

  7.   


    ? extends List的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
    所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。“不知道” 的处理方式是 “不符合”。
      

  8.   


    接 9 楼,那 ? extends List 各种不知道,这么写还有什么意义呢?—— 作为返回值的时候,有意义。就算是不知道,它总是 List 的子类型,如果是返回值,一定可以赋值给声明为 List 的变量,一定具有 List 里面定义的方法。
      

  9.   


    接 9 楼,那 ? extends List 各种不知道,这么写还有什么意义呢?—— 作为返回值的时候,有意义。就算是不知道,它总是 List 的子类型,如果是返回值,一定可以赋值给声明为 List 的变量,一定具有 List 里面定义的方法。
    +1
      

  10.   


    ? extends List的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
    所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。“不知道” 的处理方式是 “不符合”。+1
      

  11.   


    ? extends List的意思是“只有某一种List的子类型可以”,至于到底哪一种,不知道。
    所以当你给出任何一种类型,即使是 List 的子类型,对于它到底是不是符合条件,答案是“不知道”。“不知道” 的处理方式是 “不符合”。
    我再想想的
      

  12.   

    每一个?都是单独,没有任何关联
    你调用的时候,是引用不到定义时候的?的
    要用extends就直接X extends List好了
    方法的可以写成
    public <X extends List> doSomething(UseCase3<X> a)应该跟你那个效果一样
      

  13.   

    楼主你好,这是我给你修改后的代码,不知道是不是你想要的运行结果,至于解释嘛,我也是这个学期才学的,无法深入解释
    package test;import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;public class UseCase3<T>
    {
    public void doSomething(UseCase3<? extends List<String>> a)//修改的地方
    {
    System.out.println(a.getClass().getName());
    }
    public void print(UseCase3<?> t) //修改的地方
    {
    System.out.println(t.getClass().getName());
    } public static void main(String[] args)
    {
    UseCase3<? extends List<String>> a = new UseCase3<ArrayList<String>>(); //修改的地方

    a.doSomething(new UseCase3<ArrayList<String>>());  //修改的地方
    a.doSomething(new UseCase3<LinkedList<String>>()); //修改的地方
    a.print(new UseCase3<ArrayList<String>>());  //修改的地方
    UseCase3<Object> a2 = new UseCase3<Object>();
    a2.print(a2); }
    }运行结果
    test.UseCase3
    test.UseCase3
    test.UseCase3
    test.UseCase3