プリミティブ型の配列間、またはプリミティブ型の配列と参照型の配列間にサブタイピング関係はありません。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でサポートされているメソッドがリストされています。