Setはインターフェイスなので、直接インスタンス化することはできません。ただし、インターフェイスのインスタンスを取得できなければ、インターフェイスはまったく役に立ちません。によって返されるインスタンスは、インターフェイスのtree.keySet()具体的な実装です。Set
超具体的にして、TreeMap#keySet()ソースコードを見てみましょう:
public Set<K> keySet() {
return navigableKeySet();
}
わかりました、それは私たちに多くを教えてくれません。ドリルダウンする必要があります。
public NavigableSet<K> navigableKeySet() {
KeySet<K> nks = navigableKeySet;
return (nks != null) ? nks : (navigableKeySet = new KeySet(this));
}
したがって、返される具体的な型はKeySet! インターフェイスの実装がありSetます。http://www.docjar.com/html/api/java/util/TreeMap.java.html#1021
これは次のように説明します。
System.out.println(set instanceof Set); // prints true
System.out.println(set instanceof HashSet); // prints false
Setインターフェイスです。HashSetそのインターフェースの実装です。任意の実装のすべてのインスタンスにfoo instanceof Setなります。によって返されるオブジェクトの具体的な型が aではなく aであることは既に確立しています。truefoo SetTreeMap#keySet()KeySetHashSetset instanceof HashSetfalsesetKeySetHashSet
それでも意味がわからない場合は、以下を読んでくださいinstanceof。
演算子はinstanceof、オブジェクトを指定された型と比較します。これを使用して、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェイスを実装するクラスのインスタンスであるかどうかをテストできます。