在泛型中extends和super是两个关键字区别

发布时间 2023-11-02 20:10:48作者: wang_longan

在泛型中,extends和super是两个关键字,用于限制泛型类型参数的上界和下界。它们在泛型中的使用有以下区别:

  1. extends:用于限制泛型类型参数的上界,表示类型参数必须是指定类型或其子类型。在使用extends时,我们可以从泛型对象中获取数据,但不能添加任何元素。

示例代码:

public class MyClass<T extends Number> {
    private T value;

    public MyClass(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

MyClass<Integer> myInt = new MyClass<>(10);
MyClass<Double> myDouble = new MyClass<>(3.14);

Integer intValue = myInt.getValue(); // 可以获取Integer类型的值
Double doubleValue = myDouble.getValue(); // 可以获取Double类型的值

myInt.setValue(20); // 错误!无法添加元素
myDouble.setValue(4.5); // 错误!无法添加元素

在上面的例子中,通过使用extends关键字,我们限制了泛型类型参数T必须是Number类或其子类。这样,我们可以在MyClass中安全地使用Number类中的方法和属性。

  1. super:用于限制泛型类型参数的下界,表示类型参数必须是指定类型或其父类型。在使用super时,我们可以向泛型对象中添加数据,但无法从中获取数据。

示例代码:

public void addToList(List<? super Integer> list) {
    list.add(10);
    list.add(20);
}

List<Number> numberList = new ArrayList<>();
List<Object> objectList = new ArrayList<>();

addToList(numberList); // 可以添加Integer类型的元素到Number类型的List中
addToList(objectList); // 可以添加Integer类型的元素到Object类型的List中

Integer number = numberList.get(0); // 错误!无法获取Integer类型的值
Integer object = objectList.get(0); // 错误!无法获取Integer类型的值

在上面的例子中,通过使用super关键字,我们限制了List的类型参数必须是Integer的父类型。这样,我们可以将Integer类型的元素添加到List中,因为Integer是Number和Object的子类。

总结:extends和super在泛型中的区别在于extends用于限制上界,可以获取数据但不能添加元素;super用于限制下界,可以添加元素但不能获取数据。这两个关键字提供了在泛型中更精确的类型约束和灵活的类型使用。