2013-02-07 50 views
1
  1. 我看到Comparable接口只允許執行compareTo方法。那麼爲什麼我們甚至需要這個接口呢?爲什麼我們不能簡單地在我們想要的任何課程中定義和聲明該方法,而不必實現接口Comparable爲什麼Java'Comparable'比只使用compareTo方法更好?

  2. 我知道這是正確的:SortedSet<String> exampleSet = new TreeSet<String>(); < - TreeSet implements SortedSet接口。所以如果我有一個名爲「Date」的類實現Comparable,這是正確的:Comparable<Date> example = new Date<Date>();。如果是的話,我到底得到了什麼?我的意思是我得到什麼樣的對象?它有什麼屬性?如果不是,爲什麼不呢?

回答

2

爲什麼我們不能簡單地定義並聲明在任何我們想要的類中的方法,而無需實現Comparable接口?

您會如何期待排序方法在這種情況下工作?

能夠對任何元素都可以相互比較的集合進行排序真的很方便 - 並且一個接口就是表達它的方式。

這是正確的:Comparable<Date> example = new Date<Date>();

不,除非Date本身是通用的。您可能寫:

Comparable<Date> example = new Date(); 

...但它是奇這樣做。通常使用Comparable的代碼要比較現有的對象 - 例如,它將從集合中獲取值並將它們相互比較。

+1

'你怎麼指望一個排序方法,在這種情況下工作?'=僅通過寫的'compareTo'方法?我的意思是我們仍然需要爲實現「Comparable」接口的任何類編寫方法,對吧?所以對於'Date'類,比方說,我想比較兩個日期(DD/MM/YYYY),我必須編寫一個實際完成所有比較工作的'compareTo'方法。所以如果我沒有在這個類中實現'Comparable',我的程序又有什麼不同? – user2027425

+2

@ user2027425:Jon的觀點是,如果您希望某些_outside_代碼能夠幫助提供像例如排序,它必須知道如何掛鉤到你的代碼並比較不同的元素。實現'Comparable'主要是爲了讓您可以使用其他代碼或Java內置的庫,知道如何使用可比較的元素來做有用和有用的事情。 –

+0

@ user2027425:不同的是,在你的情況下,你需要一遍又一遍地寫同樣的排序代碼:'Date'一次,'Foo'一次,'Bar'一次,'compareTo'方法每一個案子,因爲沒有什麼可說的,「嘿 - 這些類型都是我唯一關心的唯一方式,即一個價值與另一個相比如何。」這是整理關心的*唯一*的東西,那麼爲什麼你要編寫代碼來以一種關心你使用哪種類型的方式進行排序呢? –

0

爲什麼我們不能簡單地定義和聲明我們的 想要的任何類中的方法,而不必實現Comparable接口?

一些CollectionsTreeMap,需要比較兩個對象,即使是一個簡單的add()操作。這樣一棵樹需要在內部將「較小」的對象放在左側的樹中,並且在右側的子樹中放大(稍微簡化一點)。
因爲這樣的泛型集合(如TreeMap)被設計爲適用於所有對象,所以對象必須知道如何執行compareTo()。

像HashMaps這樣其他類別不需要的對象實現可比(他們使用hashcode())

相關問題