3

奇妙な動作に気付きました。例を見てください。

  public static void main(String[] args) {  
    aaa(1,2);
  }

  public static void aaa(int... a){
    bbb(a);
    ccc(a);
  }

  public static void bbb(int... a){

  }

  public static void ccc(Object... a){

  }

オンbbb aは配列 {1,2} ( a = {1,2})

Onccc aは、最初の配列値が {1,2} である配列の配列です ( a = { {1,2} })

私のコードには、 として定義しなければならない場所がありますObject。しかし、もちろん、2 番目の動作は望ましくありません。両方の定義に対して同じ動作が必要です ( と の両方Object...int...が含まれます{1,2})。どうすればいいのですか?

優先値は値の配列であり、配列の配列ではありません。たとえば、bbbパラメーターは問題なく、目的のパラメーターccc{1,2}type からのものObjectです。

このようなことをしようとすると、内部配列を取得するために失敗します:

  public static void ccc(Object... a){
    ArrayList<Object> list = new ArrayList<>();
    if(a.getClass().isArray()){
      for(Object in_obj: (Object[])obj){
        list.add(in_obj);
      }
    }

    // rest of the code..
  }

エラー:java.lang.ClassCastException: I cannot be cast to java.lang.Object[]配列がプリミティブであるため..その解決策はありますか? 私はintだけでは使用しませんが、多くのプリミティブ(およびプリミティブではない)を使用します..

4

3 に答える 3

1

ご意見ありがとうございます。このスレッドのクレジットもお願いします。私が構築したのはこれです:

  private Object[] toArrayObject(Object[] array){   
    ArrayList<Object> list = new ArrayList<>();
    for(Object obj: array){
      if(obj.getClass().isArray()){
        list.addAll(Arrays.asList(getArray(obj)));
      } else{
        list.add(obj);
      }
    }

    return list.toArray();
  }

  private Object[] getArray(Object val){
    Class<?>[] ARRAY_PRIMITIVE_TYPES = { 
        int[].class, float[].class, double[].class, boolean[].class, 
        byte[].class, short[].class, long[].class, char[].class 
    };

    Class<?> valKlass = val.getClass();
    Object[] outputArray = null;

    for(Class<?> arrKlass : ARRAY_PRIMITIVE_TYPES){
      if(valKlass.isAssignableFrom(arrKlass)){
        int arrlength = Array.getLength(val);
        outputArray = new Object[arrlength];
        for(int i = 0; i < arrlength; ++i){
          outputArray[i] = Array.get(val, i);
        }
        break;
      }
    }
    if(outputArray == null) // not primitive type array
        outputArray = (Object[])val;

    return outputArray;
  }
于 2013-11-02T13:27:30.407 に答える
0

int の代わりに Integer を使用します。

public static void main(String[] args) {  
    aaa(1,2);
  }

  public static void aaa(Integer... a){
    bbb(a);
    ccc(a);
  }

  public static void bbb(Integer... a){

  }

  public static void ccc(Object... a){

  }
于 2013-11-02T10:42:58.550 に答える