【问题标题】:Cast object array to generic array将对象数组转换为通用数组
【发布时间】:2015-09-21 00:40:41
【问题描述】:

目前,我正在查看 java.util.ArrayList 的源代码。现在我发现函数 public void ensureCapacity(int minCapacity) 将对象数组转换为通用数组,就像下面的代码:

 E[] newData = (E[]) new Object[Math.max(current * 2, minCapacity)];

但是,当我将数组声明为特定类型时,IDE 会显示错误。

Object[] arr = new Object[10];
    int[] arr1 = (int[]) new Object[arr.length];

谁能告诉我它们之间的区别?非常感谢。

【问题讨论】:

    标签: java generics arraylist typecasting-operator


    【解决方案1】:

    这是因为E(在ArrayList 的源代码中)代表一些reference 类型,但不代表一些primitive 类型。

    这就是为什么在尝试将 Object 实例数组转换为基元数组时出现编译时错误的原因。

    如果你这样做(例如)

    Object[] arr = new Object[10];
    Integer[] arr1 = (Integer[]) new Object[arr.length];
    

    错误将消失。

    【讨论】:

      【解决方案2】:

      您永远不能将引用类型(从 Object 扩展的任何内容)转换为原始类型(intlongbooleanchar 等)。

      您也不能将 Object[] 等引用类型的数组转换为 int[] 等基本类型的数组。

      而基元不能代表泛型参数。

      【讨论】:

      • 但有一个例外:自动装箱,例如将原始 int 装箱到 Integer 对象中。但是您对数组转换是正确的:即使使用自动装箱,您也不能将 int[] 转换为 Integer[]
      • @MattiasBeulens 但这不是选角。这只是包装价值
      • @VinceEmigh 技术上是正确的,但它看起来像演员表,所以我想我至少要提一下。
      【解决方案3】:

      int 不是Object,但它是原始的。

      使用Integer 即可。

      Object[] arr = new Object[10];
          Integer[] arr1 = (Integer[]) new Object[arr.length];
      

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 2018-12-04
        • 2021-06-16
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        相关资源
        最近更新 更多