1

この質問が私を悩ませたとき、私はコレクションについて読んでいました。

以下は、私の疑問をテストするために書いたコードです。

public static void main(String[] args) {        
    TreeMap<Integer, String> tree = new TreeMap<Integer, String>();
    tree.put(1, "1");
    tree.put(2, "2");
    Set<Integer> set = tree.keySet();
    System.out.println(set instanceof Set);
    System.out.println(set instanceof HashSet);
}

結果 :

真/偽

上記のコードは、私のセット オブジェクトが Set のインスタンスであることを示しています。しかし、セットはインターフェイスであり、どのようにインスタンス化できますか。よくわかりません。:(

4

1 に答える 1

2

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、オブジェクトを指定された型と比較します。これを使用して、オブジェクトがクラスのインスタンス、サブクラスのインスタンス、または特定のインターフェイスを実装するクラスのインスタンスであるかどうかをテストできます。

于 2012-12-01T04:13:22.463 に答える