Java 配列リフレクション: isArray と instanceof の比較 質問する

Java 配列リフレクション: isArray と instanceof の比較 質問する

以下の使用法の間に、好みや動作の違いはありますか?

if(obj.getClass().isArray()) {}

そして

if(obj instanceof Object[]) {}

?

ベストアンサー1

ほとんどの場合、instanceofオブジェクトが配列であるかどうかをテストするには演算子を使用する必要があります。

一般的に、コンパイル時に判明している特定の型にダウンキャストする前に、オブジェクトの型をテストします。たとえば、 または で動作するコードを書いたとしますInteger[]。次int[]のようにしてキャストを保護する必要がありますinstanceof

if (obj instanceof Integer[]) {
    Integer[] array = (Integer[]) obj;
    /* Use the boxed array */
} else if (obj instanceof int[]) {
    int[] array = (int[]) obj;
    /* Use the primitive array */
} else ...

JVMレベルでは、instanceof演算子は特定の「インスタンス」ほとんどの JVM 実装で最適化されているバイト コード。

まれに、リフレクションを使用して未知の型のオブジェクト グラフをトラバースする場合があります。このような場合、isArray()コンパイル時にコンポーネントの型がわからないため、このメソッドが役立ちます。たとえば、何らかのシリアル化メカニズムを実装し、型に関係なく、配列の各コンポーネントを同じシリアル化メソッドに渡すことができる場合があります。

特殊なケースが 2 つあります: null 参照とプリミティブ配列への参照です。

null 参照によって が発生しinstanceoffalseisArrayをスローしますNullPointerException

プリミティブ配列に適用すると、右側のオペランドのコンポーネント タイプがコンポーネント タイプと正確に一致しない限り、がinstanceof生成されます。対照的に、 はどのコンポーネント タイプに対してもを返します。falseisArray()true

おすすめ記事