如何使用包含数组的Object?

时间:2014-07-14 21:35:05

标签: java arrays

所以我一直在从java库创建一个System.arraycopy ....方法,但是我把这个对象用作数组时遇到了问题。这里的问题是arr2需要一个数组,但是找到了java.lang.Object。

这是代码:

public static void arrayCopy (Object arr1 ,int pos1,Object arr2,int pos2,int limit){
    for (int i = 0; i < limit; i++) {
        *arr2[pos2]=arr1[pos1];*
        pos2++;
        pos1++;
    }
}

我试过这样做:

public static void arrayCopy (Object arr1[] ,int pos1,Object arr2[],int pos2,int limit){
    for (int i = 0; i < limit; i++) {
        arr2[pos2]=arr1[pos1];
        pos2++;
        pos1++;
    }
}

问题是该方法需要一个Object []所以当我想这样做时会出现错误:

public static void main(String[] args) {
    int[] a = new int [] {1,2,3};
    int[] b = new int [] {4,5,6};
    *arrayCopy(a, 0, b, 0, 3);*
}

它说“实际参数int []不能通过方法调用转换”转换为java.lang.Object []。我的问题是,怎么可以这样使用数组?或者我该怎么办?

3 个答案:

答案 0 :(得分:2)

int[]不是Object[]

如果要实现接受任何类型数组的方法,可以使用与System.arrayCopy()相同的签名,并使用反射来选择适当的实现。

public static void arrayCopy (Object arr1 ,int pos1,Object arr2,int pos2,int limit){ 
    if ( (arr1 instanceof int[]) && (arr2 instanceof int[]) ) {
        int[] iArr1 = (int[]) arr1;
        int[] iArr2 = (int[]) arr2;
        ...
    }
    else if ( arr1 instanceof long[]) && (arr2 instanceof long[]) ) {
        long[] iArr1 = (long[]) arr1;
        long[] iArr2 = (long[]) arr2;
        ...
    }
    // ... etc.

也就是说,如果你想要一个通用方法,那么考虑使用标准方法System.arrayCopy()是值得的。

答案 1 :(得分:0)

当您将int数组传递给arrayCopy方法时,您需要将参数用作int数组而不是ObjectObject数组。只需从

更新您的第二个方法签名
public static void arrayCopy (Object arr1[] ,int pos1,Object arr2[],int pos2,int limit){

public static void arrayCopy (int arr1[] ,int pos1,int arr2[],int pos2,int limit){

答案 2 :(得分:0)

我写了这个方法,并没有必要为每种类型的数组声明一个特殊的实现,我只需要使用Object类,因为Object类是类层次结构的根。每个类都将Object作为超类。

所以我只这样做了:

public static void arrayCopy (Object arr1 ,int pos1,Object arr2,int pos2,int limit){  
    if (( arr1 instanceof Object) && (arr2 instanceof Object))  {
        Object[] oArr1 = (Object[]) arr1;
        Object[] oArr2 = (Object[]) arr2;
        for (int i = 0; i < limit; i++) {
            oArr2 [pos2]=oArr1[pos1];
            pos2++;
            pos1++;
        }
    }
}