1

我在 Java 中有一个泛型类:

public class PriorityList<T extends Number> implements Comparable<T> {  

    T[] array = (T[]) new Object[10];

我有一个错误

java.lang.ClassCastException:[Ljava.lang.Object;不能转换为 [Ljava.lang.Number;

此转换(T[]) new Object[10]会产生错误。

我需要比较方法,因为我需要对数组元素进行排序。所以我不能像这样声明类

public class PriorityList<T extends Number> 

其他有一定意义的选项是由我自己的链表制作的,以保持 T 值。但这是解决这个铸造问题的另一种方法

(T[]) new Object[10];

?

禁止使用 PS 收藏。

4

4 回答 4

1

T 的擦除是 Number,所以:

Number[] array = new Number[10];

会让你足够接近。T可以在该数组中存储 Number 的任何子类(例如 any )。(注意:这也应该解释为什么转换为(T[])new Object[10]aka(Number[])new Object[10]会导致异常。)

于 2013-04-25T01:54:32.187 回答
0

您不能将数组Object转换为数组,Number因为Object数组可以包含任何类型的对象 - 不仅是T类型。但是new T[]由于类型错误而不正确 - 即 java 运行时不知道T.

一种方法是制作a一个Object[]数组。

另一种方法是:

public PriorityList(Class<T> type) {
    T[] a = (T[])Array.newInstance(type, 10);
}

或者,如前所述 - 使用 Java 集合 - 它们更通用。

于 2013-04-24T18:22:36.120 回答
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 的实现。

希望这可以帮助。

于 2013-04-24T18:22:36.900 回答
0

Number是 Object,但 Object不是 Number

此方法 fromjava.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;
    }
于 2013-04-24T18:40:08.993 回答