2016-07-29 1 views
0

これは奇妙な質問のように思えるかもしれませんが、ちょっと混乱します:Javaでは、NavigableSet.tailSet(Object)メソッドはSortedSetを返し、tailSet(Object、 boolean)はNavigableSetを返します。しかし、実際にはどちらもTreeSetを返すように思えます。私が意味する.tailSetはおそらくNavigableSetを返しますが、TreeSetを返すようです

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

...

  • オラクルページ

    はのtailSet(Object)を言うが返したSortedSetとのtailSet(オブジェクト、ブール値)のNavigableSet
  • 私は中の方法に比べて、私のマウスを移動それはあまりにも
  • あなたが直接それをキャストなしのNavigableSetへのtailSet(文字列)の結果を割り当てることができないという事実は、同様に
これをサポートしているので、言うエクリプス

しかし:私はデバッグモードでコードを実行し、mts.tailSet( "BLA")を調べると、それはそれは型の変数だと言われます

  • TreeSetの
  • mts.tailSet( "BLA")。 getClass()はTreeSetを返します
  • TreeSetのmts.tailSet( "bla")インスタンスはtrueを返します。

なぜですか?

EDIT:

私はTreeSetのは、設定を拡張したSortedSetを拡張するのNavigableSetを実装していることを知っています。私は、TreeSetがNavigableSetとして認識されることが理にかなっていることを知っています。しかし、NavigableSetはTreeSetとして認識されるべきではありません。

この質問のポイントはそれほど実用的ではありませんが理論的です。 (私はテストのために勉強しています。コードがコンパイルされているかどうかを知る必要があります)。 tailSetがTreeSetを返した場合、どうしてこれはコンパイルされませんか?

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

なぜキャストをTreeSetに追加する必要がありますか?

+3

私は犬を買うためにペットショップに行きましたが、後で家で調べると、私は彼らが私をドーベルマンに売却したのを見ました!彼らは私に嘘をついた!まあ、いいえ、彼らはしませんでした。 Dobermanは一種の犬であり、TreeSetは一種のSortedSetです。我々は約束されたものを得た。 – user2357112

+0

私はそれを知っています。しかし、Set <= SortedSet <= NavigableSet <= TreeSet APIが正しいと判断し、SortedSetを返した場合、それはTreeSetであってはなりません。 –

+0

"Dog <= Doberman。APIが言うことが正しいと犬を返すならば、それはDobermanではありません。"それは理にかなっているように聞こえますか?それは一種の魚のように聞こえるよね? – user2357112

答えて

1

NavigableSetおよびSortedSetは両方ともTreeSetによって実装されるインターフェイスです。どちらのメソッドも両方​​のインタフェースを実装しているので、両方のメソッドでもConcurrentSkipListSetを返すことができます。

+0

(myTreeSet instance of NavigableSet)はtrueを返し、意味があり、myNavigableSet instanceof TreeSetはfalseを返す必要があります。それで、NavigableSetを返すと仮定すると(whatWasReturnedByTailSet instanceof TreeSet)もtrueを返します。 –

関連する問題