Java 创建泛型数组
我对这段代码有一个大问题:我需要创建自己的合并方法,而不使用java的合并方法Java 创建泛型数组,java,arrays,generics,constructor,Java,Arrays,Generics,Constructor,我对这段代码有一个大问题:我需要创建自己的合并方法,而不使用java的合并方法 public static <T extends Comparable> T[] merge(T[] a, T[] b){ T[] c = (T[]) new Object[a.length + b.length]; /* * * More code * * */ return c; } publicstatict[]merg
public static <T extends Comparable> T[] merge(T[] a, T[] b){
T[] c = (T[]) new Object[a.length + b.length];
/*
*
* More code
*
*
*/
return c;
}
publicstatict[]merge(T[]a,T[]b){
T[]c=(T[])新对象[a.length+b.length];
/*
*
*更多代码
*
*
*/
返回c;
}
问题是,在运行时,我有以下错误:
java.lang.ClassCastException:[Ljava.lang.Object;不能强制转换为[Ljava.lang.Comparable;
我已经找到了这个问题,解决方法是使用反射
我在这行遇到的问题是:T[]c=(T[])新对象[a.length+b.length]
问题是我不知道如何使用它,我已经尝试用许多不同的方式使用反射,但我无法解决这个问题
我非常感谢您的回答,并告诉我应该在哪里更改代码。您可以使用反射创建一个与输入数组类型相同的数组,如下所示:
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});
这也有同样的问题。您可以使用反射创建与输入数组类型相同的数组-类似以下内容:
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});
这也有同样的问题。您可以使用
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;
}
公共静态列表合并(列表a、列表b){
列表c=新数组列表(a.size()+b.size());
/*
*
*更多代码
*
*/
返回c;
}
如果代码的其他部分强制您在
merge
中使用数组,则这可能不是一个选项,您可以使用列表
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;
}
公共静态列表合并(列表a、列表b){
列表c=新数组列表(a.size()+b.size());
/*
*
*更多代码
*
*/
返回c;
}
如果代码的其他部分强制您在
merge
中使用数组,那么这可能不是一个选项。arrays.copyOf
?(rawtypes!应该是
,或者更好的数组.copyOf
?(rawtypes!应该是
,或者更好的,因为数组的奇怪和不自然行为,您应该选择“最常见的超类”。(代码留给感兴趣的读者作为练习。)当我说“应该”,你应该按照@immibis的建议,使用List
@TomHawtin-tackline注意,我写了两个答案,因为其中任何一个都可能最适合OP的应用。(尽管出于理智,人们当然希望列表一有效)嘿,没有意识到是同一个人。引用数组被严重弄乱了(并不是说System.arraycopy
是处理数组的好方法)。您需要将Array.newInstance()
的结果转换为T[]
,因为数组的行为怪异而不自然,所以您应该选择“最常见的超类”(代码留给感兴趣的读者作为练习)“应该”,你应该遵循@immibis的建议,使用List
@TomHawtin tackline注意,我写了两个答案,因为其中任何一个都可能最适合OP的应用。(尽管出于理智,人们当然希望列表一有效)嘿,没有意识到是同一个人。引用数组被严重弄乱了(不是说System.arraycopy
是处理数组的好方法)。您需要将Array.newInstance()
的结果强制转换为T[]