Java泛型extends與super的區(qū)別

小樊
81
2024-09-29 22:51:15
欄目: 編程語言

在Java中,泛型的extends和super關(guān)鍵字具有不同的作用和意義。

  1. extends:

extends關(guān)鍵字用于限制泛型參數(shù)的上界。它表示該泛型參數(shù)必須是給定類型或其子類型。這意味著,如果你有一個(gè)泛型類或方法,你可以使用extends來指定該泛型參數(shù)必須是某個(gè)類或接口的子類型。這有助于確保類型安全,并避免在運(yùn)行時(shí)出現(xiàn)ClassCastException。

例如,假設(shè)你有一個(gè)泛型類Box,它可以容納任何類型的對(duì)象。但是,你希望確保Box只能容納那些實(shí)現(xiàn)了Comparable接口的對(duì)象。在這種情況下,你可以使用extends關(guān)鍵字來限制泛型參數(shù)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關(guān)鍵字用于限制泛型參數(shù)的下界。它表示該泛型參數(shù)必須是給定類型或其父類型。這意味著,如果你有一個(gè)泛型類或方法,你可以使用super來指定該泛型參數(shù)必須是某個(gè)類或接口的父類型。這有助于確保類型安全,并避免在運(yùn)行時(shí)出現(xiàn)ClassCastException。

然而,需要注意的是,Java泛型中的super關(guān)鍵字與類中的super關(guān)鍵字有所不同。在類中,super表示父類,用于調(diào)用父類的方法或訪問父類的成員變量。而在泛型中,super關(guān)鍵字用于限制泛型參數(shù)的下界,而不是表示父類。

例如,假設(shè)你有一個(gè)泛型方法,該方法接受一個(gè)列表作為參數(shù),并返回該列表中的所有元素的總和。你可以使用super關(guān)鍵字來限制泛型參數(shù)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;
}

在這個(gè)例子中,List<? super Number>表示一個(gè)列表,其元素類型可以是Number或其任何父類型(如Integer、Double等)。這使得該方法可以用于任何類型的Number列表,并確保類型安全。

0