2016-07-29 88 views
0

這可能看起來像一個奇怪的問題,但我有點困惑:在Java中,方法NavigableSet.tailSet(對象)應該返回一個SortedSet和tailSet(對象,布爾)返回一個NavigableSet。但在我看來,他們實際上都返回一個TreeSet。.tailSet據說返回NavigableSet,但似乎返回TreeSet

TreeSet<String> mts= new TreeSet<String>(); 
Object whatTypeAmI = mts.tailSet("bla"); 

我的意思是......

  • 神諭頁說tailSet(Object)返回一個SortedSet的和tailSet(對象,布爾)的NavigableSet
  • 當我懸停我的鼠標懸停在方法Eclipse也這麼說
  • 事實上,你不能直接將tailSet(String)的結果賦值給NavigableSet而不投射它也支持這個以及

但是:

  • 當我在調試模式下的代碼,並檢查mts.tailSet( 「BLA」),它告訴我它是類型的變量TreeSet的
  • mts.tailSet( 「喇嘛」)。 getClass()返回TreeSet
  • mts.tailSet(「bla」)instanceof TreeSet返回true。

這是爲什麼?

編輯:

我知道TreeSet中實現NavigableSet延伸的SortedSet延伸設置。我知道將TreeSet識別爲NavigableSet是有意義的。但是不應該將NavigableSet識別爲TreeSet。

這個問題的重點並不是很實用,因爲它是理論上的。 (我正在學習測試,我需要知道代碼是否可以編譯)。如果tailSet返回一個TreeSet,那麼爲什麼不能編譯?

TreeSet<String> tree = mytreeset.tailSet("xx"); 

爲什麼我需要添加一個強制轉換到TreeSet?

+3

我去寵物商店買了一隻狗,但當我稍後在家中檢查它時,我看到他們給我賣了一隻杜賓犬!他們騙我!那麼,不,他們沒有。一隻杜賓犬是一種狗,而一套TreeSet是一種SortedSet。我們都得到了承諾。 – user2357112

+0

我知道。但是Set <= SortedSet <= NavigableSet <= TreeSet 如果API所說的是正確的並且它返回一個SortedSet,那麼它不應該是TreeSet。 –

+0

「Dog <= Doberman。如果API說的是正確的,並且它返回一個Dog,那麼它不應該是一個Doberman。」這聽起來有意義嗎?聽起來有點腥,對吧? – user2357112

回答

1

NavigableSetSortedSet都是由TreeSet執行的接口。如果他們想要,這兩種方法也可以返回ConcurrentSkipListSet,因爲它也實現了兩個接口。

+0

(myTreeSet instanceof NavigableSet)返回true,這是有道理的,(myNavigableSet instanceof TreeSet)應該返回false。那麼怎麼來(whatWasReturnedByTailSet instanceof TreeSet)也返回true,如果它應該返回一個NavigableSet? –