泛型中的上下界限定符:`extends` 和 `super` 的区别

泛型中的上下界限定符:extendssuper 的区别

作为一名编程博客专家,我将带领大家深入探讨泛型中的上下界限定符 extendssuper,这两个关键字在 Java 泛型编程中扮演着至关重要的角色。本文将详细解释它们的含义、用途以及如何在实际编程中应用它们。

前置知识

在深入探讨之前,我们需要了解一些基本概念:

  1. 泛型(Generics):泛型是 Java 语言的一项特性,允许你在定义类、接口和方法时使用类型参数。这使得代码更加通用和类型安全。
  2. 类型参数(Type Parameter):类型参数是泛型中的占位符,用于表示实际类型。
  3. 继承(Inheritance):在 Java 中,一个类可以继承另一个类,从而获得父类的属性和方法。
  4. 子类型(Subtype):如果类 B 继承自类 A,那么 B 是 A 的子类型。
上下界限定符详解
1. extends(上界限定符)

extends 关键字用于指定类型参数的上界,表示类型参数必须是某个类的子类型或实现某个接口。

语法:

<T extends UpperBound>

示例代码:

public class Box<T extends Number> {
    private T content;

    public void setContent(T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}

解释:

  • Box<T extends Number> 表示 T 必须是 NumberNumber 的子类(如 IntegerDouble 等)。
  • setContent 方法接受一个 T 类型的参数,并将其存储在 content 变量中。
  • getContent 方法返回 T 类型的值。

使用示例:

Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
Integer content = integerBox.getContent();
System.out.println(content); // 输出: 123

// 下面的代码会编译错误,因为 String 不是 Number 的子类
// Box<String> stringBox = new Box<>();
2. super(下界限定符)

super 关键字用于指定类型参数的下界,表示类型参数必须是某个类的父类型。

语法:

<T super LowerBound>

示例代码:

public class Consumer<T> {
    public void consume(List<? super T> list, T item) {
        list.add(item);
    }
}

解释:

  • consume 方法接受一个 List<? super T> 类型的参数,表示列表中的元素类型必须是 TT 的父类型。
  • list.add(item)T 类型的 item 添加到列表中。

使用示例:

List<Object> objectList = new ArrayList<>();
Consumer<String> stringConsumer = new Consumer<>();
stringConsumer.consume(objectList, "Hello");
System.out.println(objectList); // 输出: [Hello]
实际应用场景
1. 使用 extends 实现类型安全的集合操作

假设我们有一个方法,需要计算一个数字列表的总和:

public static double sumOfList(List<? extends Number> list) {
    double sum = 0.0;
    for (Number num : list) {
        sum += num.doubleValue();
    }
    return sum;
}

解释:

  • sumOfList 方法接受一个 List<? extends Number> 类型的参数,表示列表中的元素类型必须是 NumberNumber 的子类型。
  • 使用 Number 类型的 doubleValue 方法将每个元素转换为 double 类型并累加。

使用示例:

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
double sum = sumOfList(integerList);
System.out.println(sum); // 输出: 15.0
2. 使用 super 实现类型安全的添加操作

假设我们有一个方法,需要将一个元素添加到列表中:

public static <T> void addToList(List<? super T> list, T item) {
    list.add(item);
}

解释:

  • addToList 方法接受一个 List<? super T> 类型的参数,表示列表中的元素类型必须是 TT 的父类型。
  • list.add(item)T 类型的 item 添加到列表中。

使用示例:

List<Object> objectList = new ArrayList<>();
addToList(objectList, "Hello");
addToList(objectList, 123);
System.out.println(objectList); // 输出: [Hello, 123]
总结

通过本文的讲解,我们详细了解了泛型中的上下界限定符 extendssuperextends 用于指定类型参数的上界,表示类型参数必须是某个类的子类型或实现某个接口;super 用于指定类型参数的下界,表示类型参数必须是某个类的父类型。这些限定符在实际编程中非常有用,能够提高代码的类型安全性和灵活性。

希望本文能够帮助你更好地理解和应用泛型中的上下界限定符。如果你有任何问题或需要进一步的解释,请随时提问。编程愉快!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要重新演唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值