这可能看起来像一个奇怪的问题,但我有点困惑:在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?
我去宠物商店买了一只狗,但当我稍后在家中检查它时,我看到他们给我卖了一只杜宾犬!他们骗我!那么,不,他们没有。一只杜宾犬是一种狗,而一套TreeSet是一种SortedSet。我们都得到了承诺。 – user2357112
我知道。但是Set <= SortedSet <= NavigableSet <= TreeSet 如果API所说的是正确的并且它返回一个SortedSet,那么它不应该是TreeSet。 –
“Dog <= Doberman。如果API说的是正确的,并且它返回一个Dog,那么它不应该是一个Doberman。”这听起来有意义吗?听起来有点腥,对吧? – user2357112