java数组赋值问题

时间:2009-12-28 20:55:27

标签: java arrays

使用方法Arrays.deepToString(Object [] a)时,我遇到了这个问题,我可以用这种方式解决。

 Object [] not_allowed = new  int[]{7, 9, 8};
 Object [] allowed  = new int[][]{{1, 2, 3}, {6, 5, 4}};

为什么我不允许在单维情况下将int []分配给Object [],但我可以在多维情况下执行此操作。

6 个答案:

答案 0 :(得分:7)

int这样的原始类型不是对象,而数组是对象 - 您可以将任何数组分配给对象引用

Object o = new  int[]{7, 9, 8};

new int[][]是一个对象数组,因此可以分配给Object[]。您可能想要编写这样的实用程序方法来执行您想要的操作:

public static String arrayToString(Object o) {
    if(o instanceof Object[])  {
        return Arrays.deepToString((Object[]) o);
    }
    else if(o instanceof long[]) {
        return Arrays.toString((long[]) o);
    }
    else if(o instanceof int[]) {
        return Arrays.toString((int[]) o);
    }
    else if(o instanceof short[]) {
        return Arrays.toString((short[]) o);
    }
    else if(o instanceof byte[]) {
        return Arrays.toString((byte[]) o);
    }
    else if(o instanceof float[]) {
        return Arrays.toString((float[]) o);
    }
    else if(o instanceof double[]) {
        return Arrays.toString((double[]) o);
    }
    else if(o instanceof boolean[]) {
        return Arrays.toString((boolean[]) o);
    }
    throw new IllegalArgumentException("input is not an array");
}

示例:

Object intArray = new  int[]{7, 9, 8};
Object[] intintArray  = new int[][]{{1, 2, 3}, {6, 5, 4}};
Object[] intintintArray  = new int[][][]{{{1, 2, 3}, {6, 5, 4}},
               {{1, 2, 3}, {6, 5, 4}}};
System.out.println(arrayToString(intArray));
System.out.println(arrayToString(intintArray));
System.out.println(arrayToString(intintintArray));

输出:

[7, 9, 8]
[[1, 2, 3], [6, 5, 4]]
[[[1, 2, 3], [6, 5, 4]], [[1, 2, 3], [6, 5, 4]]]

答案 1 :(得分:5)

int s不是Object s,这就是为什么第一个赋值是非法的:int s的数组不是Object s的数组。

但是数组,无论是什么,都是对象。您已成功将外部数据结构(数组数组)分配给Object的数组。

答案 2 :(得分:5)

小写int是一个原语,不从Object继承。请尝试使用Integer。

答案 3 :(得分:2)

第一个赋值不起作用,因为int []的元素类型是int,而不是Object。由于(您尝试分配给Object [],元素类型应该是Object,而不是int)

第二个赋值确实有效,因为int []是一个Object,因此int [] []是一个Object []。

答案 4 :(得分:1)

您的第一行无效:

Object [] not_allowed = new  int[]{7, 9, 8};

这是因为int不是Object。这将是有效的:

Object allowed = new  int[]{7, 9, 8};

答案 5 :(得分:0)

还有一点要提到的是允许的行

Object [] allowed  = new int[][]{{1, 2, 3}, {6, 5, 4}};

实际上不应该是因为你应该能够用

来跟进它
allowed[0] = "Surprise!";

因此设法将String放入一个只应包含int[]的数组中。这就是为什么Java必须在运行时检查数组元素的每个赋值,以确保指定的元素与数组的实际类型兼容,而不仅仅是让编译时类型检查处理它。因此,上面的代码会编译,但在尝试分配String时会导致异常。

此问题也仅影响数组。当泛型添加到Java时,设计人员知道更好,而在泛型集合中,int[]的集合不是Object集合的子类型,因此,如果在您的示例中,您从数组切换到通用ArrayList,比方说,两行都不会编译。