簡體   English   中英

Java Generics - 可比較的界面

[英]Java Generics - Comparable interface

在下面的代碼中, Comparable接口用於確保x和y應該具有相同的引用類型,但是當V擴展為T時,V應該與T的類型或T的子類相同,那么使用Comparable接口的重點是什么。 此外,如果我不使用Comparable接口,那么最后一次調用isIf方法isIf編譯,盡管x和y的類型不同。 任何人都可以解釋使用這個程序的Comparable接口嗎?

public class Generics_13 {

    static <T extends Comparable<T>, V extends T> boolean isIn(T x, V[] y) {
        for(int i = 0;i < y.length;i++) 
            if(x.equals(y[i])) return true;

        return false;
    }

    public static void main(String[] args) {
        Integer nums[] = {10, 20, 30};

        if(isIn(10, nums))
            System.out.println("10 belongs to the array");
        if(!isIn(60, nums))
            System.out.println("70 doesnt belong to the array");

        String arr[] = {"Neeraj", "Parth", "Ritum"};
        if(!isIn("abc", arr))
            System.out.println("abc doesnt belongs to the array");

        /*if(isIn("String", nums))      //  illegal
            System.out.println("This wont compile");
        */
    }
}

當前使用泛型並不是真的有意義,因為沒有使用過Comparable方法,這意味着您可以簡單地刪除extends聲明。

此外,類型V也沒有使用,因為你可以簡單地用T代替它而不破壞你的邏輯。 所以最終結果如下:

public class Generics_13 {
    static <T> boolean isIn(T x, T[] y) {
        for(int i = 0;i < y.length;i++) 
           if(x.equals(y[i])) return true;

        return false;
    }

    // main() etc follow here
}

但是現在我們在java-8有了Stream API ,你可以使用下面的代碼片段來實現同樣的目的:

static <T> boolean isIn(T x, T[] y) {
    return Arrays.stream(y).anyMatch(i -> i.equals(x));
}

您的方案中可比較的是可選的。

T extends Comparable<T>

這意味着無論您傳遞什么值,都應該實現可比較的接口。 這基本上意味着可以將類型參數與相同類型的其他實例進行比較。

現在您可能想知道,因為您正在傳遞原始數據類型,那么代碼如何不會拋出錯誤? 這樣做的原因是原語被自動裝箱到實現Comparable的包裝器對象。 所以你的int成為Integer,String已經是一個實現Comparable的對象。

PS:您的代碼也適用於對象,只要該類實現了可比性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM