在Java的泛型(Generics)中,extends和super关键字用于限制类型参数的范围,它们主要在定义泛型方法或泛型类时使用,以实现对类型的更精确控制。
以下是它们的主要区别和用法:
1. extends 关键字
- 用途:用于限制类型参数只能是某个类(或接口)的子类。
- 场景:常用于定义泛型方法的参数类型,或者在泛型类中定义成员变量的类型。
- 示例:
public class GenericClass<T extends Number> { private T value; public GenericClass(T value) { this.value = value; } public T getValue() { return value; } public void setValue(T value) { this.value = value; } } // 泛型方法示例 public static <T extends Comparable<T>> void sort(T[] array) { Arrays.sort(array); }
在上述例子中,GenericClass类的类型参数T被限制为Number的子类,这意味着你可以实例化GenericClass为Integer、Double等,但不能使用String或其他非Number类型。同样,泛型方法sort的类型参数T被限制为实现了Comparable接口的类型。
2. super 关键字
- 用途:用于限制类型参数只能是某个类的父类(包括该类本身)。
- 场景:常用于定义泛型方法的返回类型,或者在泛型类中定义可以接受父类类型数据的成员方法参数。
- 示例:
public class GenericClass<T super Integer> { private T value; public GenericClass(T value) { this.value = value; } public T getValue() { return value; } public void setValue(T value) { this.value = value; } public void addNumber(Integer num) { // 可以安全地将Integer赋值给T,因为T是Integer的超类 this.value = (T) num; } } // 泛型方法示例,通配符使用super public static void addNumbers(List<? super Integer> list) { list.add(1); list.add(2); }
在上述例子中,GenericClass类的类型参数T被限制为Integer的超类,这意味着你可以实例化GenericClass为Integer、Number、Object等,但不能使用Short、Byte等Integer的子类(因为它们不是Integer的超类)。addNumbers方法接受一个元素类型为Integer超类的List,因此可以添加Integer类型的元素到该列表中。
总结
extends限定了类型参数的下限,即类型参数必须是某个类(或接口)的子类。super限定了类型参数的上限,即类型参数必须是某个类的父类。extends常用于限制可以“传入”的类型(如方法参数),super常用于限制可以“传出”的类型(如方
欢迎访问我的(夏壹分享)公众号 和 博客(sanzhishu)后缀top