在Object类引用变量中创建一个Integer数组

时间:2018-01-16 08:05:54

标签: java

如果我尝试在java中创建Object类数组,它可以正常工作

Object[] o = new Integer[]{1,2,3};
    for(Object x : o)
        System.out.print(x);

输出为:123

我发现你也可以做

Object o = new Integer[]{1,2,3};

它不会导致编译失败。我想知道我们可以在引用'o'中遍历整数吗?

然后我尝试了这个

class A{ }

class B extends A{ }

class App{
    public static void main(String[] args) throws InterruptedException {
        A a = new B[4];
    }
}

但是她的A a = new B[4];给了CF

4 个答案:

答案 0 :(得分:3)

Java中的每个Object类型都继承自Object类。

所以,基本上:IntegerObject,这就是为什么你可以这样做的原因:

Object[] o = new Integer[]{1,2,3};

另一方面,Arrays也是Objects,这意味着你可以这样做:

Object o = new Integer[]{1,2,3};

在第一个示例中,IntegersObjects,在您的第二个示例中,Object o是对Array Integers的引用/ p>

更新:您的AB类之间存在异常的原因是因为即使每个B都是A,{{1存储Array的{​​}不是B

答案 1 :(得分:2)

Java数组是协变的。这意味着,您可以使用Sub类型代替Type。

因此,如果您有一个" Type"的数组,您实际上可以使用" SubType"来填充该数组。好吧,Java中的任何类都是Object的Subtype。因此在这种情况下没有错误。

  Object o = new Integer[]{1,2,3};
  

它没有给编译失败。

同样的事情,因为Array最后也是一个Object,因此你可以自由地将它分配给一个Object。

  

我想知道我们可以在参考文献中迭代整数' o' ?

默认情况下,Object不可迭代。 Array对象的位置。

因此,在进行迭代之前,必须将其强制转换为Array类型。

更新:

  

但她的A a =新B [4];给CF

当然不是有效的声明你应该写

A[] a = new B[4];  // just to satisfy the compiler. At run time you are not allowed to store A's in it.

但是如果你想要实现这种风格

  Object o = new Integer[]{1,2,3};

不,这不会在这里工作,你只能写

 Object o =  new B[4];

这是因为数组是Object类的子类型而不是A类。

答案 2 :(得分:0)

这是可能的原因是数组是Object的子类。但是,通过将数组存储在o中,程序会“忘记”o持有数组的事实。因此,您无法迭代o

答案 3 :(得分:0)

编译器只允许你做它已经知道的事情。你可以去那个特定的班级。这是一个类比:你想要运输1公吨的沙子几英里。你会要求一辆"车辆,"或者你会特别要求某种卡车,你知道它会大到可以拖沙吗?如果您要求某种类型的车辆,"因为你知道他们可能会给你一辆普锐斯,这显然对你没什么好处 - 普锐斯不能运输1吨沙子。在这种情况下,编译器会"抱怨"我绝对不能保证你会发送一辆能够做你想做的车辆。

类型以这种方式工作 - 默认情况下,将数组向上转换为Object类型是完全有效的,因为Java中的所有是{{1}的子类型}}。但是,从编译器的角度来看,绝对保证你可以迭代这种类型的东西,所以它不会让你这样做。