如何修复在构造函数中初始化 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 对象和所需的尺寸。
我正在处理数据结构,我似乎无法初始化通用元素数组;
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 对象和所需的尺寸。