泛型中extends和super的区别

19 阅读2分钟

在Java的泛型(Generics)中,extendssuper关键字用于限制类型参数的范围,它们主要在定义泛型方法或泛型类时使用,以实现对类型的更精确控制。

以下是它们的主要区别和用法:

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的子类,这意味着你可以实例化GenericClassIntegerDouble等,但不能使用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的超类,这意味着你可以实例化GenericClassIntegerNumberObject等,但不能使用ShortByteInteger的子类(因为它们不是Integer的超类)。addNumbers方法接受一个元素类型为Integer超类的List,因此可以添加Integer类型的元素到该列表中。

总结

  • extends限定了类型参数的下限,即类型参数必须是某个类(或接口)的子类。
  • super限定了类型参数的上限,即类型参数必须是某个类的父类。
  • extends常用于限制可以“传入”的类型(如方法参数),super常用于限制可以“传出”的类型(如方

欢迎访问我的(夏壹分享)公众号博客(sanzhishu)后缀top