ybattle 2013-01-10 20:09
浏览 206
已采纳

谁能给我解释一下Set<?>和Set的区别?(无内文)

null :o :o :o

  • 写回答

4条回答 默认 最新

  • iteye_1858 2013-01-11 11:42
    关注

    为了叙述方便,我把Set改为List,因为Set没有getter方法

    List向前兼容,不带泛型的容器。它不做任何泛型检查。例如你可以写:
    [code="java"]
    List list = new ArrayList();
    list.add("s");
    String s = (String) list.get(0); //list.get(0)的返回类型是Object
    System.out.println(s);
    [/code]
    完全可以正确运行。

    List<?>的?后如果不加extends或者super修饰的话,相当于List<? extends Object>,它是所有List的父类。但在使用List<?>的实例时,方法参数中的泛型参数将无法适配任何实际变量,而返回值中的泛型参数将变为<? extends T>中的T(单独写<?>则取缺省值Object)。例如

    [code="java"]
    List<? extends Number> list = new ArrayList(3); //容器List<? extends Number>是容器List的父类
    //List list2 = new ArrayList(3); //编译出错,容器List不是容器List的父类。
    list.add(3); //编译出错。但去掉这行后后续代码能正确运行。
    final Number n = list.get(0);
    System.out.println(n);
    [/code]

    使用泛型通配符?可以把容器元素的继承关系推导到容器本身上,但限制了带泛型参数方法的使用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?