[英]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
)。 它們是兩種不同的類型! thing1
和thing2
是類的泛型類型的實例,不一定是可比較的。
因此,您應該聲明您的類的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.