如何避免类似接口生成的转换错误

时间:2013-04-24 18:13:35

标签: java generics casting comparator comparable

我在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 收藏品很少使用。

5 个答案:

答案 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]会导致异常。)