簡體   English   中英

了解Java中的泛型和可比性

[英]Understanding generics and comparable in Java

我正在努力創建要求其元素具有可比性的通用數據類型。

我試圖構建我認為是此方法的最基本實現,但仍無法正常工作。

public class GenericPair<T> {
    T thing1;
    T thing2;

    public GenericPair(T thing1, T thing2){
        this.thing1 = thing1;
        this.thing2 = thing2;
    }   


    public <T extends Comparable<T>> int isSorted(){ 
        return thing1.compareTo(thing2);
    }   

    public static void main(String[] args){
        GenericPair<Integer> onetwo = new GenericPair<Integer>(1, 2); 
        System.out.println(onetwo.isSorted());
    }   
}

我的理解是>要求無論T類型最終如何,它都必須實現可比的,因此必須具有compareTo()函數。 在這種情況下,整數應該具有此功能嗎?

我收到錯誤消息:

GenericPair.java:15: error: cannot find symbol
    return thing1.compareTo(thing2);
                 ^
    symbol:   method compareTo(T)
    location: variable thing1 of type T
    where T is a type-variable:
    T extends Object declared in class GenericPair

這里發生了什么?

public <T extends Comparable<T>> int isSorted(){ 
    return thing1.compareTo(thing2);
}  

這個新的T隱藏了類的類型參數(也稱為T )。 它們是兩種不同的類型! thing1thing2類的泛型類型的實例,不一定是可比較的。

因此,您應該聲明您的類的type參數是可比較的:

class GenericPair<T extends Comparable<T>>

現在:

public int isSorted(){ 
    return thing1.compareTo(thing2);  // thing1 and thing2 are comparable now
}   

問題在於整個類的通用T不知道compareTo方法。 即使您為單個方法聲明了<T extends Comparable<T>> ,您也只是在創建一個新的T ,該類從類中隱藏了通用T的定義。

一個解決方案可能是在類本身中聲明T extends Comparable<T>

class GenericPair<T extends Comparable<T>> {
    public int isSorted() {
        return thing1.compareTo(thing2);
    }
}
public <T extends Comparable<T>> int isSorted(){ 
    return thing1.compareTo(thing2);
}

您不能使用對類定義的通用類型參數施加新約束的方法。 您將必須聲明

public class GenericPair<T extends Comparable<T>> {
   public int isSorted() {
     return thing1.compareTo(thing2);
   }
}

暫無
暫無

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

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