创建通用阵列

时间:2015-03-24 02:25:13

标签: java arrays generics constructor

我对这段代码有一个很大的问题:我需要创建自己的Merge方法而不使用java的Merge方法。

public static <T extends Comparable> T[] merge(T[] a, T[] b){
    T[] c = (T[]) new Object[a.length + b.length];  

    /*
     *
     * More code
     *
     *
    */
    return c;
}

问题是在运行时我有这个错误: java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.Comparable; 我已经找到了这个问题,解决方案是使用Reflection。

我在这一行中遇到的问题:T [] c =(T [])new Object [a.length + b.length];

问题在于我不明白如何使用它,已经尝试过多种不同的反射方法,但我无法解决这个问题。

我真的很感激任何答案,并告诉我应该在哪里更改我的代码。

2 个答案:

答案 0 :(得分:4)

你可以使用反射创建一个与输入数组相同类型的数组 - 如下所示:

if(a.getClass() != b.getClass()) // or .equals if you prefer. It doesn't matter for Class objects
    throw new IllegalArgumentException("Arrays don't have the same type");

T[] c = Array.newInstance(a.getClass().getComponentType(), a.length + b.length);

请注意,不可能使用T.class之类的内容。另请注意,对于以下情况,这将无法正常工作:

Comparable[] result = <Comparable>merge(new Integer[] {1, 2, 3}, new Integer[] {4, 5, 6});

结果将是Integer[]而不是Comparable[]。但是,如果不将Comparable.class传递给函数,或者在调用结果数组之前预先分配结果数组,它就是最接近的。

或者您可以使用Ming-Tang建议的Arrays.copyOf,然后使用null填充数组(否则以a的副本开头):

if(a.getClass() != b.getClass()) // or .equals
    throw new IllegalArgumentException("Arrays don't have the same type");

T[] c = Arrays.copyOf(a, a.length + b.length);
Arrays.fill(c, null);

这有同样的问题。

答案 1 :(得分:2)

您可以改为使用List

public static <T extends Comparable> List<T> merge(List<T> a, List<T> b){
    List<T> c = new ArrayList<T>(a.size() + b.size());

    /*
     *
     * More code
     *
     */
    return c;
}

如果代码的其他部分强制您在merge中使用数组,则可能无法使用此选项。