Java泛型extends与super的区别

avatar
作者
猴君
阅读量:0

在Java中,泛型的extends和super关键字具有不同的作用和意义。

  1. extends:

extends关键字用于限制泛型参数的上界。它表示该泛型参数必须是给定类型或其子类型。这意味着,如果你有一个泛型类或方法,你可以使用extends来指定该泛型参数必须是某个类或接口的子类型。这有助于确保类型安全,并避免在运行时出现ClassCastException。

例如,假设你有一个泛型类Box,它可以容纳任何类型的对象。但是,你希望确保Box只能容纳那些实现了Comparable接口的对象。在这种情况下,你可以使用extends关键字来限制泛型参数T必须是Comparable或其子类型。

public class Box<T extends Comparable<T>> {     private T item;      public void set(T item) {         this.item = item;     }      public T get() {         return item;     }      public int compareTo(Box<T> other) {         return item.compareTo(other.item);     } } 
  1. super:

super关键字用于限制泛型参数的下界。它表示该泛型参数必须是给定类型或其父类型。这意味着,如果你有一个泛型类或方法,你可以使用super来指定该泛型参数必须是某个类或接口的父类型。这有助于确保类型安全,并避免在运行时出现ClassCastException。

然而,需要注意的是,Java泛型中的super关键字与类中的super关键字有所不同。在类中,super表示父类,用于调用父类的方法或访问父类的成员变量。而在泛型中,super关键字用于限制泛型参数的下界,而不是表示父类。

例如,假设你有一个泛型方法,该方法接受一个列表作为参数,并返回该列表中的所有元素的总和。你可以使用super关键字来限制泛型参数List必须是Number或其子类型,以便在该方法中使用Number类的方法,如intValue()、doubleValue()等。

public static double sum(List<? super Number> list) {     double sum = 0;     for (Number n : list) {         sum += n.doubleValue();     }     return sum; } 

在这个例子中,List<? super Number>表示一个列表,其元素类型可以是Number或其任何父类型(如Integer、Double等)。这使得该方法可以用于任何类型的Number列表,并确保类型安全。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!