Java泛型中的extend 和 super

在 Java 泛型中,extendssuper 是用于通配符类型的关键字,用于限制泛型类型参数的上界和下界。它们在泛型方法和类中起到了非常重要的作用,帮助实现类型安全和灵活的代码。

extends 关键字

用法

extends 用于指定类型参数的上界,即泛型类型参数必须是指定类的子类或实现类。

语法
class GenericClass<T extends Number> {
    // 类定义
}

void method(List<? extends Number> list) {
    // 方法定义
}
示例
class Box<T extends Number> {
    private T value;

    public void set(T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }
}

public class Main {
    public static void main(String[] args) {
        Box<Integer> intBox = new Box<>();
        intBox.set(10);
        System.out.println(intBox.get());

        Box<Double> doubleBox = new Box<>();
        doubleBox.set(10.5);
        System.out.println(doubleBox.get());
    }
}

在这个示例中,Box 类的类型参数 T 必须是 Number 的子类。因此,可以用 IntegerDouble 来实例化 Box

super 关键字

用法

super 用于指定类型参数的下界,即泛型类型参数必须是指定类的父类或超类。

语法
void method(List<? super Integer> list) {
    // 方法定义
}
示例
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<? super Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);

        for (Object obj : list) {
            System.out.println(obj);
        }
    }
}

在这个示例中,list 可以是 Integer 的任何父类的列表。super 关键字通常用于消费数据的场景,即从泛型集合中读取数据。

PECS 原则

extendssuper 的使用通常遵循 PECS 原则:

  • Producer Extends: 如果需要一个只读的泛型集合(生产者),使用 extends
  • Consumer Super: 如果需要一个只写的泛型集合(消费者),使用 super
示例
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> intList = List.of(1, 2, 3);
        printNumbers(intList);

        List<Number> numList = List.of(1, 2.0, 3);
        addNumbers(numList);
    }

    // Producer Extends
    public static void printNumbers(List<? extends Number> list) {
        for (Number num : list) {
            System.out.println(num);
        }
    }

    // Consumer Super
    public static void addNumbers(List<? super Integer> list) {
        list.add(4);  // 可以添加Integer
    }
}

printNumbers 方法中,我们使用 extends 关键字,因为我们只从列表中读取数据。在 addNumbers 方法中,我们使用 super 关键字,因为我们只向列表中添加数据。

详细解释

extends
  • 上界通配符:使用 ? extends T,表示可以接受类型 T 或其子类。
  • 适用场景:通常用于只读操作。例如,从一个集合中读取数据。
super
  • 下界通配符:使用 ? super T,表示可以接受类型 T 或其父类。
  • 适用场景:通常用于写操作。例如,向一个集合中添加数据。

总结

  • extends:用于指定类型参数的上界,通常用于生产者(只读)的场景。
  • super:用于指定类型参数的下界,通常用于消费者(只写)的场景。
  • PECS 原则:Producer Extends, Consumer Super,指导何时使用 extendssuper

通过理解和正确使用 extendssuper,可以编写出类型安全且灵活的泛型代码,满足各种不同的需求。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java泛型extendsuper是用于限制泛型类型参数的关键字。 extend用于限制泛型类型参数的上界,表示泛型类型参数必须是指定类型的子类或实现类。例如,List<? extends Number>表示泛型类型参数必须是Number类或其子类。 super用于限制泛型类型参数的下界,表示泛型类型参数必须是指定类型的父类或超类。例如,List<? super Integer>表示泛型类型参数必须是Integer类或其父类。 使用extendsuper可以使泛型类型参数更加灵活,可以适应不同的场景需求。但是需要注意的是,使用过多的extendsuper可能会导致代码可读性降低,因此需要根据实际情况进行选择和使用。 ### 回答2: Java可以通过泛型实现更强大的类型安全和代码的复用性。在使用泛型时,我们常常需要了解泛型extendsuper关键字,以便更好地理解和使用。 泛型extend关键字 泛型extend关键字用于限定泛型类型参数的上限,表示泛型类型参数必须是继承了某个类或实现了某个接口才能被使用。例如: ``` public class GenericClass<T extends Number> { private T data; public GenericClass(T data) { this.data = data; } public T getData() { return data; } } ``` 在上面的泛型,使用了T extends Number语法,表示泛型类型参数T必须是继承了Number类的某个子类,否则编译会报错。这样可以保证data属性的类型一定是Number或其子类类型。 泛型super关键字 泛型super关键字用于限定泛型类型参数的下限,表示泛型类型参数必须是某个类的父类或某个接口的实现类。例如: ``` public class GenericClass<T super Number> { private T data; public GenericClass(T data) { this.data = data; } public T getData() { return data; } } ``` 在上面的泛型,使用了T super Number语法,表示泛型类型参数T必须是Number类的父类,即可以是Number类本身或其父类类型。这样可以保证data属性的类型一定是Number类或其父类类型。 需要注意的是,泛型extendsuper关键字只能用于泛型类型参数,而不能用于普通类型。在实际使用,我们需要根据具体的情况来灵活地使用泛型extendsuper关键字,以便在代码实现更好的类型安全和更高的代码复用性。 ### 回答3: Java泛型是一种非常强大的语言特性,允许我们使用一种类型来表示多种类型,在编写类型安全且可重用的代码时经常用到。在泛型的使用,我们有时需要约束所能使用的泛型类型,使得代码更加类型安全。在这种情况下,我们可以使用泛型extendsuper 关键字。 在 Java ,使用 extends 关键字可以为泛型类型参数添加上限限制。通过 extends 关键字,我们可以指定泛型类型参数必须是某个类或接口的子类。这样做的好处是能够防止代码使用无效的类型参数,从而保证代码的类型安全性。值得注意的是,我们只能使用 extends 关键字来添加上限限制,而不能添加下限限制。 下面是一个例子,演示如何使用 extends 关键字: ``` public class Box<T extends Number> { private T t; public Box(T t) { this.t = t; } public T get() { return t; } public void set(T t) { this.t = t; } } ``` 可以看到,Box 类使用了 extends 关键字,将泛型类型参数 T 限制为 Number 类型或其子类型。在此之后,我们就可以在 Box 类安全地使用 Number 类型或其子类型,如 Integer、Double 等。 除了上限限制之外,Java 还提供了另一种泛型类型参数的约束方式:super 关键字。使用 super 关键字,我们可以限制泛型类型参数必须是某个类或接口的父类。这个约束通常用于需要消费泛型对象的情况,例如集合类的 add 方法。通过为泛型类型参数添加 super 关键字,我们可以保证只能添加某个类的子类到集合,从而防止集合出现无效的元素。类似地,我们也只能使用 super 关键字添加下限限制,而不能添加上限限制。 这里是一个例子,演示如何使用 super 关键字: ``` public class Box<T> { private List<? super T> list; public Box() { list = new ArrayList<>(); } public void add(T t) { list.add(t); } public void addAll(List<? extends T> otherList) { list.addAll(otherList); } } ``` 可以看到,Box 类使用了 super 关键字来限定集合存储的类型,只能是 T 的父类或其本身。这样做的好处是,保证添加到集合的元素都是类型安全的,避免了程序运行时出现错误。 总之,泛型类型参数的 extendsuper 关键字是 Java 泛型使用的重要工具,能够帮助我们实现类型安全的代码。在实际使用,根据具体场景灵活运用这两个关键字,能够提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

青衫客36

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

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

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

打赏作者

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

抵扣说明:

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

余额充值