2013-11-22 56 views
3

我是新來的java和試圖理解一些概念。這是我不明白的一段代碼。Java界面/比較器

public static Comparator<Fruit> FruitNameComparator = new Comparator<Fruit>() 
{ 
    public int compare(Fruit fruit1, Fruit fruit2) 
    { 
     return fruit1.quantity - fruit2.quantity; 
    } 
}; 

我知道這是做什麼,但不明白爲什麼這是允許的。所以我的問題是:

  1. 從java文檔,Comparator [T]是一個接口。比較器[水果]怎麼樣?我會假設它是一個類,因爲它必須覆蓋比較函數。
  2. 爲什麼FruitNameComparator可以在{}中使用非參數構造函數和類定義進行初始化?我沒有在Comparator [T]的javadoc中找到這樣的構造函數聲明。

任何輸入將不勝感激。

回答

5

此代碼使用Java的一項功能,稱爲anonymous inner classes。您可以指定要實現/擴展的接口或超類,以及匿名類體。你的匿名內部類實現Comparator<Fruit>

+0

+1實際上,如果你把它放在一個名爲MyClass的類中(例如)並編譯它,你會看到一個像MyClass $ 1.class這樣的文件。這是這個匿名類的類文件。 – yshavit

+0

將其讀爲... = new(實現的類)Comparator () – isnot2bad

+0

謝謝。在閱讀我們的評論並思考它之後,我明白爲什麼代碼是合法的。正是我在找什麼。 –

0

這是一個匿名類,它是類型(超類或接口)的內聯具體實現。

實現提供給類型聲明的任何抽象方法。

在超類的情況下,調用的構造函數不能被指定,因此如果沒有缺省/無參數構造函數,則必須提供參數。

在接口的情況下,因爲接口不能聲明構造函數,所以在構造函數中不能指定參數。


順便說一句,我會傾向於命名場fruitQuantityComparstor,而不是fruitNameComparator,因爲它比較數量,不