在Java中,泛型的extends和super關鍵字具有不同的作用和意義。
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);
}
}
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列表,并確保類型安全。