Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要在Java中重铸从对象数组中访问的整数数组?_Java_Arrays_Object - Fatal编程技术网

为什么我需要在Java中重铸从对象数组中访问的整数数组?

为什么我需要在Java中重铸从对象数组中访问的整数数组?,java,arrays,object,Java,Arrays,Object,我有下面的代码生成一个对象数组,并将两个整数数组传递给它。然后,我想将另一个整数数组变量设置为对象数组中的一个数组 但是,除非执行(int[])类型转换步骤,否则会出现错误。为什么我需要执行此重播?我假设对象中的数组是int[],因为它们是这样传递的 public class test { public static void main(String[] args){ int[] arr1 = {1,2,3,4}; int[] arr2 = {4,5,

我有下面的代码生成一个对象数组,并将两个整数数组传递给它。然后,我想将另一个整数数组变量设置为对象数组中的一个数组

但是,除非执行(int[])类型转换步骤,否则会出现错误。为什么我需要执行此重播?我假设对象中的数组是int[],因为它们是这样传递的

public class test {

    public static void main(String[] args){

        int[] arr1 = {1,2,3,4};
        int[] arr2 = {4,5,6};

        Object[] x = {arr1, arr2};

        int[] left =(int[]) x[0];

        for (int element : left){
            System.out.println(element);
        }

    }

}

x是一个对象数组

因此,该数组的一个元素是对象

x[0]是一个对象


它也是int[]不是语言所知道的。一袋物品可以让你把几乎任何类型的东西放进袋子里,但袋子不必记住每件东西的具体类型。当你把一个东西从袋子里拿出来的时候,你所知道的只是它是一个对象,因为袋子被声明为持有这个对象。

对象类是Java中所有类的超类。因此,当您将int数组传递给对象类型时,它将作为对象类型接收。现在,对象数组有两个对象元素。毫无疑问,它们也是整数。但是对于变量x,它们是对象

现在,在检索元素时,需要将其转换为int,因为它们是x的对象


您可以将任何子类对象引用到其超类引用。但是,当您将再次从其超类引用中检索子类对象时,您需要强制转换它。因为您的超类引用不知道它的哪个子类类型

这段代码应该可以回答您的问题

  public static void main(String[] args) {

    int[] arr1 = { 1, 2, 3, 4 };
    String[] arr2 = { "a", "b", "c" };

    Object[] x = { arr1, arr2 };

    int[] left = (int[]) x[0];
    for (int element : left) {
      System.out.println(element);
    }
  }

当您将arr1、arr2推入另一个Object[]类型的数组时,编译器不会假定Object[]x数组中的元素类型,因为它可以接受任何类型的数组。这就是为什么编译器强制您从Object[]array x强制转换使用的元素。

首先,让我解释一下java的一些要点:

  • java是java中所有对象的母亲
  • Java具有称为自动装箱和自动取消装箱的功能
Object[]x={arr1,arr2};
分配此参数时,java编译器将:

  • 自动将自动装箱arr1、arr2转换为整数[](包装器之一)
  • 然后,由于Object是java中所有对象的母亲,它只需将整数[]转换为Object[]
这就是为什么需要将其重铸为原始int[], 因为变量x已经是对象[]


希望这对您有所帮助

arr1
arr2
属于
int[]
类型,但是当您将它们存储在
Object[]
类型的数组中时,会隐藏它们的真实类型。您可以将
x
声明为
int[][]
类型,则不需要强制转换。