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であることは既に確立しています。true
foo
Set
TreeMap#keySet()
KeySet
HashSet
set instanceof HashSet
false
set
KeySet
HashSet
それでも意味がわからない場合は、以下を読んでくださいinstanceof
。
演算子はinstanceof
、オブジェクトを指定された型と比較します。これを使用して、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェイスを実装するクラスのインスタンスであるかどうかをテストできます。