7.7.2、无界通配符

这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
无界通配符

无界通配符类型是使用通配符(?)指定的,例如List<?>。这称为未知类型列表。如下两种情况推荐使用无界通配符:

  • 如果你正在编写一个可以使用Object类中提供的功能来实现的方法
  • 当代码使用不依赖于类型参数泛型类中的方法时。例如:List.size或List.clear。事实上,经常使用Class<?> 是因为类Class<T>中的大多数方法不依赖于T。

考虑下面的方法 printList

public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

printList 的目标是打印任何类型的列表,但是它没有完成这个目标—它只打印 Object 实例的列表;它不能打印List<Integer>, List<String>, List<Double>,等等,因为它们不是List<Object>的子类型。要编写一个通用的printList方法,请使用List<?>:

public static void printList(List<?> list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

因为对于任何具体类型A, List<A>是List<?>,你可以使用 printList 打印任何类型的列表:

List<Integer> li = Arrays.asList(1, 2, 3);
List<String>  ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

注意: List<Object>和List<?>是不一样的。可以将ObjectObject 的任何子类型插入到List<Object> ;
但是你只能将null 插入到List<?>中。通配符使用指南部分提供了关于如何确定在给定情况下应该使用何种通配符(如果有的话)的更多信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值