我在Java中有一个泛型类:
public class PriorityList<T extends Number> implements Comparable<T> {
T[] array = (T[]) new Object[10];
我有错误
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Number;
Erorr由此(T [])新对象[10] 制作。
我需要比较方法,因为我需要对数组元素进行排序。所以我不能像这样声明类
public class PriorityList<T extends Number>
有一些意义的其他选项是由我自己的链表制作以保持T值。但是解决这个铸造问题的另一种方法是
(T [])new Object [10];
PS 收藏品很少使用。
答案 0 :(得分:0)
您无法将Object
数组转换为Number
数组,因为Object
数组可以包含任何类型的对象 - 不仅仅是T
类型。但由于类型错误导致new T[]
不正确 - 即java运行时不知道T
。
一种方法是将a
设为Object[]
数组。
另一种方式是:
public PriorityList(Class<T> type) {
T[] a = (T[])Array.newInstance(type, 10);
}
或者,如上所述 - 使用Java集合 - 它们更通用。
答案 1 :(得分:0)
您无法将保留数组转换为未知类型的数组。我建议你以这种方式为T对象使用数组工厂:
public interface ArrayFactory<T extends Number> {
T[] create(int size);
}
public class PriorityList<T extends Number> implements Comparable<T> {
private ArrayFactory<T> factory=...;
T[] array = factory.create(10);
然后,您可以向PriorityList提供ArrayFactory的实现。
希望这有帮助。
答案 2 :(得分:0)
数字是对象,但对象不是数字
java.util.Arrays
中的此方法包含您想要的逻辑。它可以创建一个T
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
答案 3 :(得分:0)
只需将其更改为
即可T[] array = (T[]) new Comparable[10];
由于T
的下限为Comparable
,因此对T[]
的强制转换实际上会导致转化为Comparable[]
。这是您看到失败的演员,因为Object[]
没有投放到Comparable[]
。
答案 4 :(得分:0)
T的删除是数字,所以:
Number[] array = new Number[10];
会让你足够近。可以在该数组中存储Number的任何子类(例如,任何T
)。 (注意:这也应该解释为什么转换为(T[])new Object[10]
又名(Number[])new Object[10]
会导致异常。)