5

instanceof は正確にどのように機能しますか? 相互に拡張および実装するオブジェクトの階層がある場合、何かのインスタンスであることはこれらの両方の行で機能しますか?

たとえば、オブジェクトがListまたはArrayListまたはのインスタンスであるかどうかを知りたいCollectionですか?

このツリーを調べましたhttp://docs.oracle.com/javase/6/docs/api/java/util/package-tree.html

そして、それらはすべて当然のことのように見えObjectますが、私が必要としているのはAbstractCollection、または通常Collectionのものでさえあると思います。

Collectionこれら 3 つのクラスすべてをカバーするためだけにオブジェクトをチェックする場合、問題はありませんか?

4

4 に答える 4

10

Collection のみに対してオブジェクトをチェックして、これら 3 つのクラスすべてをカバーする場合、問題はありませんか?

はい、instanceof CollectionCollection インターフェイスのすべての実装 (直接または間接) に対して true を返します。

これが望ましくないまれなケースでは、リフレクションを使用する必要があります。たとえば、Class#getDeclaredClassesは、クラスによって直接拡張/実装されるすべてのクラスとインターフェースのリストを提供します。

何かが Collection であることがわかったら、それをキャストしてそのメソッドにアクセスできます ( などiterator)。

  if (myObject instanceof Collection){
      Collection<?> c = (Collection<?>) myObject;
      for (Object o: c){
         // do something with every element in the collection
      }
  }
于 2012-12-07T11:56:00.420 に答える
1
if(obj instanceof Collection) 

オブジェクトが何らかの種類のコレクションである場合、true を返します。したがって、3 つのケースでは true が返されますが、HashMap などの他のケースでも true が返されます。

于 2012-12-07T11:55:44.930 に答える
1

Collection のみに対してオブジェクトをチェックして、これら 3 つのクラスすべてをカバーする場合、問題はありませんか?

常にではない。

オブジェクトが である可能性がありis-aます。CollectionArrayList

例えば:

ArrayList anArrList = new ArrayList();
HashMap ahashMap = new HashMap();

anArrList instanceof Collection // true
ahashMap instanceof Collection // true

しかし、両者は異なる階層にあります。

于 2012-12-07T11:55:56.053 に答える
1

instanceof演算子はtrue、検査されたオブジェクトが特定のクラスのクラスまたはサブクラスである場合、またはそれ (またはその先祖の 1 つ) が特定のインターフェイスを実装している場合に戻ります。

于 2012-12-07T11:58:13.743 に答える