java - java 上的数组参数行为

标签 java arrays

我只是注意到一个奇怪的行为,看这个例子:

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

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

我的代码中有些地方必须将其定义为Object。但是当然不需要第二种行为..我想要两个定义的相同行为( Object...int... 将包含 { 1,2}).我该怎么做?

首选值是值数组而不是数组数组。例如bbb参数是可以的,而ccc中想要的参数是{1,2}来自类型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[] because the array is primitive.. 有解决方案吗?我不只使用 int,而是使用很多原始的(而不是原始的)..

最佳答案

感谢您的输入,我也想要信用 this线。我构建的是这样的:

  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;
  }

关于java - java 上的数组参数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19740914/

相关文章:

ubuntu - 在 Ubuntu 上安装 JDK 时遇到问题

c# - 将C#数组传递给C++ vector

javascript - 使用 Array.prototype.reverse() 反转数组的元素

c - 如何在C中为未知大小的结构数组分配内存

从链表创建一个数组并对该数组进行排序 C

java - 从 java 编写 .npy(numpy 二进制格式)

java - 测试 Camel quartz 路线

java - C#按位异或(^)与Java按位异或(^)对比

java - 从数据库到应用范围

c++ - 在循环之前选择更少或更大运算符的最佳方法