111

オブジェクトがリフレクションを使用せずに配列であるかどうかをJavaで確認するにはどうすればよいですか?また、リフレクションを使用せずにすべてのアイテムを反復処理するにはどうすればよいですか?

私はGoogleGWTを使用しているので、リフレクションを使用することは許可されていません:(

refelectionを使用せずに次のメソッドを実装したいと思います。

private boolean isArray(final Object obj) {
  //??..
}

private String toString(final Object arrayObject) {
  //??..
}

ところで:GWT以外の環境で使用できるようにJavaScriptも使用したくありません。

4

6 に答える 6

280

使用できますClass.isArray()

public static boolean isArray(Object obj)
{
    return obj!=null && obj.getClass().isArray();
}

これは、オブジェクト型とプリミティブ型の両方の配列で機能します。

toStringについては、を見てくださいArrays.toString。配列型を確認し、適切なtoStringメソッドを呼び出す必要があります。

于 2010-04-27T23:26:30.137 に答える
73

を使用できますinstanceof

JLS15.20.2型比較演算子instanceof

 RelationalExpression:
    RelationalExpression instanceof ReferenceType

実行時に、instanceof演算子の結果は、 RelationalExpressiontrueの値がそうではなく、参照を.を上げることなくReferenceTypeにキャストできる場合です。それ以外の場合、結果はです。nullClassCastExceptionfalse

つまり、次のようなことができます。

Object o = new int[] { 1,2 };
System.out.println(o instanceof int[]); // prints "true"        

すべての配列タイプを検出する場合は、オブジェクトが、、、、、、、、、、、またはであるかどうかをinstanceof boolean[]確認する必要がbyte[]あります。short[]char[]int[]long[]float[]double[]Object[]

また、anint[][]はであるinstanceof Object[]ため、ネストされた配列の処理方法によっては、複雑になる可能性があります。

には、toStringおよびその他のオーバーロードを使用できます。ネストされた配列にも使用できます。java.util.ArraystoString(int[])deepToString(Object[])

public String toString(Object arr) {
   if (arr instanceof int[]) {
      return Arrays.toString((int[]) arr);
   } else //...
}

これjava.util.Arraysは非常に反復的です(ただし、非常に反復的です)が、配列を使用するJavaの場合と同じです。

も参照してください

于 2010-04-27T22:15:15.293 に答える
39

次のコードを使用して、配列の各要素に個別にアクセスできます。

Object o=...;
if ( o.getClass().isArray() ) {
    for(int i=0; i<Array.getLength(o); i++){
        System.out.println(Array.get(o, i));
    }
}

これはどの配列でも機能するため、基になる配列の種類を知る必要がないことに注意してください。

于 2014-05-09T15:25:58.727 に答える
10

プリミティブ型の配列間、またはプリミティブ型の配列と参照型の配列間にサブタイピング関係はありません。JLS4.10.3を参照してください。

したがって、以下は、が任意の種類objの配列であるかどうかを確認するためのテストとしては正しくありません。

// INCORRECT!
public boolean isArray(final Object obj) {
    return obj instanceof Object[];
}

obj具体的には、がプリミティブの1次元配列である場合は機能しません。(ただし、すべての配列タイプはのサブタイプであるため、高次元のプリミティブ配列では機能しますObject。ただし、この場合は意味がありません。)

私はGoogleGWTを使用しているので、リフレクションを使用することは許可されていません:(

(質問の配列部分に対する)最良の解決策isArrayは、「反射を使用する」と見なされるものによって異なります。

  • GWTでは、呼び出しはリフレクション1obj.getClass().isArray()の使用としてカウントされないため、これが最善の解決策です。

  • それ以外の場合、オブジェクトが配列型であるかどうかを判断する最良の方法は、一連のinstanceof式を使用することです。

    public boolean isArray(final Object obj) {
        return obj instanceof Object[] || obj instanceof boolean[] ||
           obj instanceof byte[] || obj instanceof short[] ||
           obj instanceof char[] || obj instanceof int[] ||
           obj instanceof long[] || obj instanceof float[] ||
           obj instanceof double[];
    }
    
  • 次のようにオブジェクトのクラスの名前をいじってみることもできますが、への呼び出しobj.getClass()はリフレクションに隣接しています。

    public boolean isArray(final Object obj) {
        return obj.getClass().toString().charAt(0) == '[';
    }
    

1-より正確には、このページClass.isArrayにはGWTでサポートされているメソッドがリストされています。

于 2010-04-27T22:46:00.363 に答える
0

ユーティリティクラスを作成して、そのクラスがコレクションマップ、または配列を表しているかどうかを確認できます。

  public static boolean isCollection(Class<?> rawPropertyType) {
        return Collection.class.isAssignableFrom(rawPropertyType) || 
               Map.class.isAssignableFrom(rawPropertyType) || 
               rawPropertyType.isArray();
 }
于 2019-01-22T19:24:36.840 に答える
0

単純obj instanceof Object[]に(JShellでテスト済み)。

于 2019-11-24T15:24:13.023 に答える