2016-07-29 93 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? –

相关问题