Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建泛型数组_Java_Arrays_Generics_Constructor - Fatal编程技术网

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

我对这段代码有一个大问题:我需要创建自己的合并方法,而不使用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[]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[]