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){

  }

Onbbb a是一个数组 {1,2} ( a = {1,2})

Onccc a是数组的数组,其第一个数组值为 {1,2} ( a = { {1,2} })

我的代码中有一些地方我必须将其定义为Object. 但是当然不需要第二种行为。我希望两个定义的行为相同(两者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

使用整数而不是整数。

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 回答
0

Java 不会将int数组自动装箱到Integer数组中。您可以做的一件事是, in ccc,检查每个Objectina并检查它是否是int[],如果是,则分别处理这些ints。

您可以做的另一件事是int先将数组装箱;要么编写你自己的方法来完成它,要么例如 Apache Commons Lang 提供ArrayUtils.toObject()

你也可以用Integerall around 开始。

尽管如此,如果你发现自己处于这种情况,你应该退后一步,想想你正在做的事情是否最有意义。

于 2013-11-02T10:43:50.897 回答