18

したがって、配列である可能性のあるオブジェクトがあります。プリミティブまたは文字列にすることもできます。配列の場合は、文字通り何でも配列にすることができます。

それが配列であるかどうかを判断するのに問題はありませんが、値を取得するために反復できるものにキャストできないようです。

// o is an object and clazz is the class of the o
if (clazz == Array.class) {
            Class ofArray = o.getClass().getComponentType();
            String arrayType = ofArray.getName(); // 'Double' for my test case
            //ERROR: [D cannot be cast to [Ljava.lang.Object 
            Object[] objects = (Object[]) o; 
    }

私のバックグラウンドは ruby​​ と php (それが機能する場所) であり、静的な型付けは私の頭をいじっています。何か案は?

編集:

これはエラーをスローします

[D cannot be cast to [Ljava.lang.Object.

私は何が欠けていますか?

if (o.getClass().isArray()) {
    Object[] objects = (Object[]) o;  
}
4

4 に答える 4

23

すべてのプリミティブ型を切り替えたくない場合は、次のようにすることができます。

if (ofArray.isPrimitive()) {
    int length = Array.getLength(o);
    for (int i = 0; i < length; i++) {
        Object obj = Array.get(o, i);
        System.out.println(obj);
    }
}
else {
    Object[] objects = (Object[]) o;
    for (Object obj : objects) {
        System.out.println(obj);
    }
}

編集: コード内の 2 つの異なる場所でループしたくない場合は、このメソッドを使用してプリミティブ配列をオブジェクト配列に変換します。

static Object[] convertToObjectArray(Object array) {
    Class ofArray = array.getClass().getComponentType();
    if (ofArray.isPrimitive()) {
        List ar = new ArrayList();
        int length = Array.getLength(array);
        for (int i = 0; i < length; i++) {
            ar.add(Array.get(array, i));
        }
        return ar.toArray();
    }
    else {
        return (Object[]) array;
    }
}
于 2013-05-07T20:33:23.730 に答える
2

これは、 のサブクラスである要素を持つ配列に対して機能しますObject

if (clazz.isArray()) {
    Object[] objects = (Object[]) o;
    for (Object obj : objects)
        System.out.println(obj);
}   

配列を特定の配列タイプにキャストする必要がある場合は、(ab)使用できますinstanceofが、たとえば、コンテンツを文字列として出力するだけの場合はObject[]十分です。

アップデート

配列がプリミティブ型の場合、それぞれをテストして正しい型にキャストする以外に選択肢はありませんがObject[]、この場合は機能しませんが Java にはそれほど多くのプリミティブ型がないため、機能しません。巨大なスイッチになります:)。これが私が意味することです:

if (clazz.isArray()) {
    if (clazz.getComponentType().equals(double.class)) {
        double[] numbers = (double[]) o;
        for (double d : numbers)
            System.out.println(d);
    }
}  
于 2013-05-07T19:59:36.247 に答える
1

プリミティブの配列を型キャストすることはできませんObject[]

if (clazz == Array.class) {
  Class ofArray = o.getClass().getComponentType();
  // String arrayType = ofArray.getName(); // 'Double' for my test case
  if (ofArray instanceof double.class)
    double[] doubles = (double[]) o;
  for (double d: doubles)
    System.out.println(d);
}

チェックObject[]なしを作成するにはinstanceof

if (!(o instanceof Object[])) {
  int len = Array.getLength(o);
  Object[] objects = new Object[len];
  for (int i = 0; i < len; i++)
    objects[i] = Array.get (o, i);
  for (Object obj: objects)
    System.out.println(obj);
}
于 2013-05-07T20:28:35.723 に答える
1

配列であることを知るだけでは十分ではありませんObject。配列要素の基になる型も知っておく必要があります。配列要素がプリミティブ型の場合、たとえばdouble、する必要があります

double[] doubleArray = (double[]) o;  

これはうまくいきません:

Object[] objects = (Object[]) o;  
于 2013-05-07T20:25:29.907 に答える