有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java上的数组参数行为

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

  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{}上有一个数组{1,2}(a = {1,2}

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

我的代码中有一些地方必须将其定义为Object。当然,第二种行为是不可取的。。我希望两个定义具有相同的行为(无论是Object...还是int...都将包含{1,2})。我该怎么做

首选值是一个值数组,而不是一个数组和一个数组。例如bbb参数是ok,并且ccc中所需的参数是来自类型Object{1,2}

如果我尝试这样做是为了获得内部数组,我将失败:

  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,而且还使用了很多primitive(而不是primitive)


共 (3) 个答案

  1. # 1 楼答案

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

    您可以做的另一件事是首先装箱int数组;或者编写自己的方法来完成,或者例如apachecommons Lang提供ArrayUtils.toObject()

    您也可以在开始时使用Integer

    不过,如果你发现自己处于这种情况,你应该后退一步,想想你所做的是否最有意义

  2. # 2 楼答案

    谢谢你的输入,我还想信贷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;
      }
    
  3. # 3 楼答案

    使用整数而不是int

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