2011-08-03 42 views
3
1 class test { 
2  public static int compare0(Comparable x, Comparable y) { 
3   return x.compareTo(y); 
4  } 

5  public static int compare1(Object x, Object y) { 
6   return ((Comparable) x).compareTo((Comparable) y); 
7  } 

8  public static int compare2(Object x, Object y) { 
9   Comparable p = (Comparable) x; 
10   Comparable q = (Comparable) y; 
11   return (p).compareTo(q); 
12  } 

13  public static void main(String[] args) { 
14   Comparable zero = new Integer(0); 
15   Comparable one = new Integer(1); 
16   int c = (zero).compareTo(one); 
17  } 
18 } 

未經檢查呼叫編譯上面的代碼產生4個警告:爪哇:到的compareTo(T)

% javac -Xlint:unchecked test.java 
test.java:3: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable 
    return x.compareTo(y); 
        ^
test.java:7: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable 
    return ((Comparable) x).compareTo((Comparable) y); 
            ^
test.java:13: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable 
    return (p).compareTo(q); 
         ^
test.java:19: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable 
    int c = (zero).compareTo(one); 
          ^
4 warnings 

我嘗試了許多更多的變種,但警告保持。什麼是寫和調用上面的test.compare方法的正確方法?

謝謝!

PS:test.compare只是一個例子;我不需要這樣的功能;但我需要實現一個像test.compare一樣的函數,它需要在其簽名中包含可比較實現的對象。 PS2:我已經編程了25年以上,我甚至在10年前編寫了Java程序一段時間,但現在使用Java(我的工作要求)正在讓我瘋狂。對於一個有經驗的程序員來說,學習Java比看起來更難。有很多東西在學習Java,其中99%至多是過時的,或者是爲編程新手排序(即大量冗長),最壞的情況是徹頭徹尾的垃圾......我還沒有找到引用在Java上,這將讓我快速回答上述問題的答案。

+1

*「我還沒有找到Java的參考資料,可以讓我快速回答上述問題的答案。」*這可能是因爲它是一個非常廣泛的主題,您似乎還沒有開始研究。這裏有一個參考:[Java教程>學習Java語言>泛型 - 簡介](http://download.oracle.com/javase/tutorial/java/generics/generics。html) –

+2

@Mark Peters:事實證明,即使在我編寫上面的代碼之前,我已經閱讀了您鏈接到的引用,並且我發現它有缺陷,因爲我描述的原因很多:詳細,旨在編程(不僅僅是Java)新手,完全基於那些沒有涵蓋專業程序員每天必須處理的情況類型的微不足道的例子等。它當然不會告訴我如何解決這篇文章中描述的問題。我確信這類材料有一個選區,但它不能幫助我。 – kjo

回答

5

你應該用一般的參數聲明compare方法。

public class ThisTest 
{ 
    public static <T extends Comparable<T>> int compare(T x, T y) { 
     if (x == null) 
      return -(y.compareTo(x)); 
     return x.compareTo(y); 
    } 

    public static void main() 
    { 
     // Type inferred 
     int c = compare(Integer.valueOf(0), Integer.valueOf(1)); 
     // Explicit generic type parameter 
     c = ThisTest.<Integer>compare(Integer.valueOf(0), Integer.valueOf(1)); 
    } 
} 
+1

是的,存在語法錯誤,但您處於正確的軌道上。如果你想爲'compare'方法使用顯式類型參數,你需要像'ClassName'那樣調用它。 比較(...)'。但是,顯式參數在這裏沒有用處,因爲類型參數將根據參數被正確推斷。 –

+0

@Mark:謝謝。我最近一直在做C#,在Java中我有點生疏。 –

+0

這是處理'null'的好方法。 – erickson

5

Comparable是通用的 - 你應該定義變量與Comparable<Integer>

+0

我不知道你的意思是「定義它」。定義什麼? – kjo

+0

變量...可比較零=新的整數(0)'; (旁註:更喜歡'Integer.valueOf(..)') – Bozho

+0

@downvoter - 解釋? – Bozho

1

聲明zeroone作爲IntegerComparable<Integer>而不是原始類型。

Angelika Langer製作了a great reference for generics.它是一個分層次的常見問題,它可以讓你快速找到對大多數類型問題的特定答案。在這種情況下,您可能會發現section on raw types有用。

2

真正的問題是,您正試圖在靜態方法中進行比較。讓比較非靜態的方法,實例化一個或多個「測試器」對象並提交每個對象的類型。例如:

test<String> strTester = new test<String>(); 

然後調用比較方法爲String對象:

int retCode = strTester.comp(a, b) 

如果你想比較其他類型的對象,如整數,你需要像一個新的測試對象:

test<Integer> intTester = new test<Integer>(); 

如果你願意這樣做,那麼你的類可以沿着線的定義:

class test<T extends Comparable<T>> { 
     public int comp(T x, T y) { 
      ... 
     } 
}