问题:T [] b =(T [])new Object [n];

时间:2011-04-07 04:28:08

标签: java generics

public class MergeSort
{
    /**
     * @param a Array to be sorted.
     * @param n Last element to be sorted.
     * @return void.
     */
    public static <T extends Comparable<T>> void sort(T[] a, int n)
    {
    }

    /**
     * @param inp Input Array.
     * @param out Output Array.
     * @param first First index.
     * @param mid Middle index.
     * @param last Last index.
     * @return void.
     */
    private static <T extends Comparable<T>>
            void merge(T[] inp, T[] out, int first, int mid, int last)
    {
    }
}

大家好,我需要一些帮助。

以上是我教授给我们的大纲。我的问题是我想在sort方法中创建一个T [] b数组,所以当我将它们传递给merge方法时,我可以重用两个数组'a'和'b'。我每次调用它时都不会在合并中创建临时数组。我试过了

T[] b = (T[]) new Object[n];

该类将编译,但是当我从主类中使用Integer数组调用sort方法时,我得到:

  

java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.Comparable;

我该怎么办? 如果我在任何地方都错过了这个答案,那么我的任何帮助都会得到很大的帮助。我一直在寻找这一天的大部分时间。谢谢!

2 个答案:

答案 0 :(得分:4)

嗯,简短的回答是,在Java中,数组和泛型不能很好地协同工作。

正如您所知,Java泛型是使用类型擦除实现的,这意味着在编译时类型可能是<T extends Comparable<T>>[],在运行时类型被擦除到其下限,在本例中为{ {1}}(使用原始类型)。 Comparable[]的类型 not 实际上已删除为T[],除非它实际上是通用约束的下限。

这样做的结果是可以安全地说:

Object[]

一切都应该如你所愿。

请注意,如果您尝试混合数组和泛型,实际上还有很多警告。例如,您可以通过使用通用通配符(例如@SuppressWarnings("unchecked") T[] b = (T[]) new Comparable<?>[n]; <? extends T>)来实现协方差和协方差,但Java中的数组本身实现协方差(当您尝试使用时,只需抛出<? super T>使其类型不变量无效)。因此,如果您能够从数组切换到泛型类型(例如,ArrayStoreException可能会执行您想要的操作),那么您将发现事情变得更加顺利。

您可能还会发现这些链接很有用:

答案 1 :(得分:0)

由于Object无法转换为T

T b = (T) new Object();

因此,这也不是真的

T[] b = (T[]) new Object[n];

您可以查看如何实施Collection.toArray(T[] a)来创建类型为T的新数组。