如果我尝试在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
答案 0 :(得分:3)
Java中的每个Object类型都继承自Object
类。
所以,基本上:Integer
是Object
,这就是为什么你可以这样做的原因:
Object[] o = new Integer[]{1,2,3};
另一方面,Arrays
也是Objects
,这意味着你可以这样做:
Object o = new Integer[]{1,2,3};
在第一个示例中,Integers
是Objects
,在您的第二个示例中,Object
o是对Array
Integers
的引用/ p>
更新:您的A
和B
类之间存在异常的原因是因为即使每个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}的子类型}}。但是,从编译器的角度来看,绝对保证你可以迭代这种类型的东西,所以它不会让你这样做。