.tailSet应该返回NavigableSet,但似乎返回TreeSet

时间:2016-07-29 22:12:24

标签: java treeset

这可能看起来像一个奇怪的问题,但我有点困惑:在Java中,方法NavigableSet.tailSet(Object)应该返回一个SortedSet,而tailSet(Object,boolean)返回一个NavigableSet。但在我看来,他们实际上都返回了TreeSet。

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

我的意思是......

  • oracle页面说tailSet(Object)返回一个SortedSet和tailSet(Object,boolean)一个NavigableSet
  • 当我将鼠标悬停在Eclipse中的方法上时,它也是如此
  • 你不能直接将tailSet(String)的结果分配给NavigableSet而不强制它也支持这一点

BUT:

  • 当我在调试模式下运行代码并检查mts.tailSet(“bla”)时,它告诉我它是TreeSet类型的变量
  • mts.tailSet(“bla”)。getClass()返回TreeSet
  • mts.tailSet(“bla”)instanceof TreeSet返回true。

为什么?

编辑:

我知道TreeSet实现了NavigableSet,它扩展了扩展Set的SortedSet。我知道将TreeSet识别为NavigableSet是有意义的。但是NavigableSet不应该被识别为TreeSet。

这个问题的重点不是实际用途,而是理论上的。 (我正在学习测试。我需要能够判断代码是否会编译)。如果tailSet返回一个TreeSet,那么为什么不编译?

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

为什么我需要向TreeSet添加强制转换?

1 个答案:

答案 0 :(得分:1)

NavigableSetSortedSet都是TreeSet实现的接口。如果他们想要这两种方法也可以返回ConcurrentSkipListSet,因为它也实现了两个接口。