[英]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.