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条)

报告相同问题?

悬赏问题

  • ¥15 深度学习残差模块模型
  • ¥20 两个不同Subnet的点对点连接
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)