在泛型中extends和super是两个关键字区别
在泛型中,extends和super是两个关键字,用于限制泛型类型参数的上界和下界。它们在泛型中的使用有以下区别:
- 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类中的方法和属性。
- 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用于限制下界,可以添加元素但不能获取数据。这两个关键字提供了在泛型中更精确的类型约束和灵活的类型使用。