数组真的是同质的吗?

4
在下面的代码中,EX1和EX2证明了同种类型的理论,但在EX3中却包含了多种类型的值。那么,我们如何说数组是同种类型的呢?背后的确切理论是什么?
public class Test {
        public static void main(String[] args) {
            // Ex 1
            int [] intArr = new int[5];
            intArr[0] = 1;
            intArr[1] = 2;

            // Ex 2
            int [] intArr2 = new int[5];
            intArr2[0] = 1;
            intArr2[1] = "ss";

            // Ex 3
            Object [] objArr = new Object[5];
            objArr[0] = 1;
            objArr[1] = "ss";
            objArr[3] = new Object();
        }
    }

2
你将EX3声明为对象数组,Java的语法糖允许你不必显式地声明1和"ss"为Object(就像自动装箱和拆箱与Integer <-> int一样)。但是当它们被添加到数组中时,它们会被强制转换为Object,因此数组保持同质性。它只包含类型为Object的值。 - Random Guy
3
您不能将字符串赋值给int数组。您在发布代码之前进行了测试吗? - Tim Biegeleisen
2
@TimBiegeleisen 我认为这是 OP 的观点的一部分,即数组是同类的,OP 应该将 Ex 2 标记为导致编译错误的代码。 - xtratic
1
@xtratic 是的,在看到Random Guy的评论后,我理解了这个问题。 - Tim Biegeleisen
1
@Sandun Perera 在示例3中,objArr [0] 包含一个 int 装箱成的 Object 类型的 Integer 对象;objArr [1] 包含一个 String 类型的 Object 对象;而 objArr [3] 包含明显是一个 Object 类型的 Object 对象。因此,您有一个包含许多 Objects 的数组。 - xtratic
@ Tim Biegeleisen:是的,Ex1和EX3工作正常。EX2有编译错误。 - Sandun Perera
1个回答

3

这里有两个概念:继承和自动装箱

继承 - String继承于Object,因此它也是一个Object。这意味着String会在编译时自动获得Object类中定义的所有方法和属性。它是一个Object,同时具有String特定的其他内容。但是,由于它是一个Object,Java可以将其视为Object。当它被添加到数组中时,它将被作为一个Object而不是一个String添加。这是因为该数组被定义为包含对象的数组。

char a = "ss".charAt(1);   // Legal as charAt(..) is a method in the String class
Object [] objArr = new Object[5];
objArr[1] = "ss";  
objArr[1].charAt(1);       // Not legal because charAt(..) method is not defined for Object

请参考Oracle教程自动装箱 - Java执行一种称为自动装箱的快捷方式,将原始类型自动转换为一组特殊的包装类,这些类都继承自Object。因此,由于自动装箱和继承,将数字分配给对象也会将该数字转换为对象。
因此,添加到数组中的所有内容都是作为对象添加的。虽然数组中的对象可能是从Object继承的类,但就数组而言,它们是Object类型。即使如此,如果您将其从数组中取出并将其强制转换为Integer,则可以这样做。它仍然携带着Integer信息,但是没有进行强制转换就无法使用该信息。从数组的角度来看,它只是一个Object。
请参考Oracle教程

谢谢,我明白了您的意思。您是指数字1(int)转换为Integer(封装类)1,然后在添加到数组时再次转换为Object吗? - Sandun Perera
1
几乎。它将1转换为整数包装类。但是,当它将其添加到数组中时,我不会说它将其转换。这就是它变得有点更加混乱的地方。它将其作为对象添加到数组中。但是,如果您从数组中取出并将其强制转换为整数,则可以这样做。它仍然携带着整数信息,但是该信息在强制转换中不可用。从数组的角度来看,它只是一个对象。 - LiveNLearn
@LiveNLearn 我建议你将那个评论融入到你的回答中,因为那是一个重要的观点。 - Basil Bourque
谢谢大家。@LiveNLearn 我想我明白你的意思了?通过分析字节码,有可能理解这里发生了什么吗? - Sandun Perera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接