在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