Java泛型中的问号

概念

在 Java 中,问号(?) 被称为 通配符(Wildcard),它主要用于泛型类型参数中,表示可以接受任何类型。问号是 Java 泛型系统中的一种特殊符号,允许你编写更灵活的代码,同时保持类型安全。

用途

1. 无界通配符(?)

? 表示可以接受任何类型,但你不能对其进行特定类型的操作(比如访问特定类型的方法)。它通常用于不关心具体类型的情况下。

List<?> list = new ArrayList<>();

这里,List<?> 可以代表 List<Integer>, List<String>, List<Object> 等任何类型的列表。

2. 上界通配符(? extends T)

? extends T 表示通配符可以是 T 类型或其子类型。这个用法通常用于方法参数中,表示该方法可以接受 T 类型或者 T 的子类型。

public void printList(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}

在上面的代码中,List<? extends Number> 表示可以接受 List<Number>, List<Integer>, List<Double> 等类型的列表。可以读取元素,但是不能修改列表中的元素。

3. 下界通配符(? super T)

? super T 表示通配符可以是 T 类型或其父类型。这个用法常常用在需要写入元素的场景,比如向列表中添加元素。

public void addNumbers(List<? super Integer> list) {
    list.add(10);  // 可以添加 Integer 或其子类的元素
}

在这个例子中,List<? super Integer> 表示该列表可以是 List<Integer>, List<Number>, List<Object> 等类型。可以往列表中添加 Integer 类型及其子类的对象,但不能直接读取列表中的元素。

4. 限制通配

你也可以通过extends或super限制通配符的上界或下界。

  • 上界通配符:? extends T 限制通配符只能是 T 类型及其子类。
  • 下界通配符:? super T 限制通配符只能是 T 类型及其父类。
// 上界通配符
public void printNumbers(List<? extends Number> list) {
    for (Number num : list) {
        System.out.println(num);
    }
}

// 下界通配符
public void addToList(List<? super Integer> list) {
    list.add(10);  // 只能添加 Integer 或其子类
}

总结

? 是一个通配符,可以代表任何类型。
? extends T 用于限定上界,表示可以是 T 或其子类。
? super T 用于限定下界,表示可以是 T 或其父类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值