我对这段代码有一个很大的问题:我需要创建自己的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];
问题在于我不明白如何使用它,已经尝试过多种不同的反射方法,但我无法解决这个问题。
我真的很感激任何答案,并告诉我应该在哪里更改我的代码。
答案 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
中使用数组,则可能无法使用此选项。