【问题标题】:Returning an int array with object array return type返回具有对象数组返回类型的 int 数组
【发布时间】:2018-04-16 00:12:13
【问题描述】:

我正在做这样的事情:

public Object [] getApple() {
    return new int[4];
}

但是 Java 编译器不允许这样做。 它说不能从 int[] 转换为 Object[]。

如果我这样做:

public Object  getApple() {
    return new int[4];
}

它编译得很好。 谁能解释为什么 int [] 不能隐式转换为 Object []?

【问题讨论】:

  • Object[]int[] 不同,因为您只考虑元素的类型,而不是数组本身。它们不一样;而Object[]Object 的孩子(一切都是),因此可以编译。
  • int 是 primitif 而 Object 不是所以你不能返回它。如果你想返回 int,我建议你使用 Integer[4]。
  • Object[] 期望返回一个对象数组。而 int 数组 (int[]) 是单个对象。例如,如果您要返回 2 个或更多 int 数组,它们将适合对象数组

标签: java casting


【解决方案1】:

ints 不是Objects,这就是原因。它们是原始数据类型,它们扮演着特殊的角色,并且不在具有 all-parent Object 的类树中。

第二个示例有效,因为int[] 数组本身可以解释为Object


你可以使用包装类Integer,它是Object的子类:

public Object[] getApple() {
    return new Integer[4];
}

由于自动装箱,您可以像 int[] 一样使用它。所以如果你这样做了

Integer[] values = (Integer[]) getApple();
values[1] = 5;

Java 会自动将5 装箱到代表5 的对应Integer 对象中,然后将此Integer 添加到数组中。

如果你这样做也会发生同样的情况

int val = values[2];

Java 将从 Integer 对象中拆箱并为您提供 int,因为 val 的类型为 int

请注意,自动装箱不适用于数组,因此 Java 不会自动将您的 int[] 转换为 Integer[]。它只适用于intInteger,反之亦然(类似地适用于double 等其他原语)。

【讨论】:

    【解决方案2】:

    这是因为 array 在 Java 中是一个 Object。因此,当您尝试将 int 数组作为对象返回时,它被接受了。

    但是,当您尝试将 int 数组 作为 对象数组 返回时,它将被拒绝,因为当方法返回类型期望(对象数组)时,您将返回 int 数组(对象)。

    public Object[] getApple()    //expecting (array of object) 
    {  
        return new int[4];        //returning array (an object) Type mismatch!
    }
    

    如果你运行以下命令,它将是可编译的:

    public Object[] getApple()    //expecting (array of object) 
    {  
        return new int[4][4];     //returning array of array (array of object) O.K!
    }
    

    【讨论】:

      【解决方案3】:

      因为您返回的是原始 int[] 数组,它不是 Object[] 的子类型。您可以改为返回 Integer[]。

      【讨论】:

      • 一个 int 数组肯定是一个对象。单个对象,并且单个对象不等同于对象数组
      • 好吧,我错了,我想我不得不说原始 int 不是对象。
      • 嗯,任何 int 例如 int i = 9;是一个对象。 Whitfin 在上面做了评论,一切都是 Object 的子对象
      • 据我所知,引用类型是 Object 的子类。原始类型, int 可以通过装箱传递其对应的 Integer 对象。
      • 那么,如果我有一个 Object 的返回类型,我就不能返回原始类型的东西?
      【解决方案4】:

      数组有特定的类型,子类的数组本身不是超类数组的子类。

      【讨论】:

        猜你喜欢
        • 2014-10-27
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        • 1970-01-01
        • 2018-03-22
        • 2017-02-08
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多