如何修复在构造函数中初始化 E 元素数组的错误?

How to fix the error in initializing array of E elements in constructor?

我正在处理数据结构,我似乎无法初始化通用元素数组;

public class Heap <'E extends Comparable<E>'> { 

private E elements[];

public Heap(int n) {

    E[] es = (E[]) new Object[n];
    elements=es;

    }
}

public static void main(String[]args) {

        Heap<Integer>tree=new Heap<Integer>(10);
}

当我 运行 程序时,我得到这个错误:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable; at heaptree.Heap.(Heap.java:16) at heaptree.Heap.main(Heap.java:70)

有人可以建议解决此问题的方法吗?

问题

你不能在 Java 那样做,没有机会。因为您需要 运行 时的信息,而这些信息仅在编译时可用。您根本无法创建泛型数组。

无论您在何处创建 new Heap<Whatever>,只有编译器知道您需要 Whatever 作为通用 E 类型。在 E 构造函数中,您尝试创建一个可用作 E[] 的数组,在该示例中意味着 Whatever[]。在 Java 中,Whatever[] 不是例如 class 的子 class Object[],尽管 Whatever 当然是 Object 的子 class。您不能在需要 Object[] 的地方使用 Whatever[],反之亦然。

因此,在需要 Whatever[] 数组的地方只能使用精确的 Whatever[] 数组,让您在 运行 时需要知道这次您必须创建Whatever 的数组。而<Whatever>信息被编译器擦除,运行时不可用。

解决方法/解决方案

如果您查看例如ArrayList,您会发现专家们的做法有所不同,不是尝试创建特定类型的数组,而是创建常量、通用类型的数组 Object。 ArrayList 仅将 get() 方法的 return 值之类的东西转换为泛型类型,而不是内部数组本身。

因此,使用涵盖所有可能 E 类型的固定类型创建数组,例如Comparable[],并在 return 之前使用 get() 将数组元素转换为 E

或者,您可以将 E class 对象传递给构造函数,如 Heap(Class<E> targetClass, int n),这样您就可以在 运行 时获得它,并使用 Array.newInstance(targetClass, n) 与那个 class 对象和所需的尺寸。