Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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_Generics - Fatal编程技术网

是否可以填充泛型列表并从java中的方法返回它?

是否可以填充泛型列表并从java中的方法返回它?,java,generics,Java,Generics,我有一个使用反射来填充对象[]数组的方法,该方法当前返回对象[],我想将其转换为创建的实际反射类实例。例如: public Object[] populateReflectionObject(Class<?> c) { Object[] reflectionArrayPopulated = methodToCreateArrayFromReflection(c); return reflectionArrayPopulated; } FinalObject[] po

我有一个使用反射来填充
对象[]
数组的方法,该方法当前返回对象[],我想将其转换为创建的实际反射类实例。例如:

public Object[] populateReflectionObject(Class<?> c) {
    Object[] reflectionArrayPopulated = methodToCreateArrayFromReflection(c);
    return reflectionArrayPopulated;
}

FinalObject[] populate = (Object[])populateReflectionObject(FinalObject.class);
公共对象[]populateReflectionObject(c类){
Object[]reflectionArrayPopulated=从反射创建阵列的方法(c);
返回反射阵列人口;
}
FinalObject[]填充=(对象[])populateReflectionObject(FinalObject.class);
不可能在数组之间强制转换,是否可以通过使用泛型实现我想要的

编辑:我创建要强制转换的对象,如下所示:

Object[] object = new Object[finalObjectArray.length];
for (int i = 0; i < finalObjectArray.length; i++) {
   object[i] = finalObjectArray;
}
Object[]Object=新对象[finalObjectArray.length];
对于(int i=0;i
您可以在阵列之间进行强制转换(在本例中,执行未选中的向下转换)

使用泛型处理它(以便您可以返回任何数组类型)将是这样的

public <T> T[] populateReflectionObject(Class<T> c) {
    Object reflectionArrayPopulated = ...
    return (T[]) reflectionArrayPopulated;
}
public T[]populateReflectionObject(c类){
对象反射率ArrayPopulated=。。。
返回(T[])反射面积;
}
编辑:下面的代码片段更准确(如果我这次正确理解了您的意图)

@SuppressWarnings(“未选中”)
公共T[]createArray(类clazz,int-length){
return(T[])Array.newInstance(clazz,length);
}

您可以在阵列之间进行强制转换(在本例中,执行未选中的向下转换)

使用泛型处理它(以便您可以返回任何数组类型)将是这样的

public <T> T[] populateReflectionObject(Class<T> c) {
    Object reflectionArrayPopulated = ...
    return (T[]) reflectionArrayPopulated;
}
public T[]populateReflectionObject(c类){
对象反射率ArrayPopulated=。。。
返回(T[])反射面积;
}
编辑:下面的代码片段更准确(如果我这次正确理解了您的意图)

@SuppressWarnings(“未选中”)
公共T[]createArray(类clazz,int-length){
return(T[])Array.newInstance(clazz,length);
}

您可能希望泛化您的方法并抑制有关强制转换数组的警告:

import java.lang.reflect.Array;
import java.util.Arrays;

public class TestClass {
    @SuppressWarnings("unchecked")
    public static <T> T[] createArray(Class<T> clazz) {
        return (T[]) Array.newInstance(clazz, 2);
    }

    public static void main(String[] args) {
        String[] strings = createArray(String.class);
        strings[0] = "Hello";
        strings[1] = "World";
        System.out.println(Arrays.toString(strings));
    }
}
import java.lang.reflect.Array;
导入java.util.array;
公共类TestClass{
@抑制警告(“未选中”)
公共静态T[]createArray(类clazz){
return(T[])Array.newInstance(clazz,2);
}
公共静态void main(字符串[]args){
String[]strings=createArray(String.class);
字符串[0]=“你好”;
字符串[1]=“世界”;
System.out.println(Arrays.toString(strings));
}
}

我在这里使用的是静态方法,但它也适用于实例方法。请注意,main方法中的调用不需要强制转换。

您可能希望泛化您的方法并抑制有关强制转换数组的警告:

import java.lang.reflect.Array;
import java.util.Arrays;

public class TestClass {
    @SuppressWarnings("unchecked")
    public static <T> T[] createArray(Class<T> clazz) {
        return (T[]) Array.newInstance(clazz, 2);
    }

    public static void main(String[] args) {
        String[] strings = createArray(String.class);
        strings[0] = "Hello";
        strings[1] = "World";
        System.out.println(Arrays.toString(strings));
    }
}
import java.lang.reflect.Array;
导入java.util.array;
公共类TestClass{
@抑制警告(“未选中”)
公共静态T[]createArray(类clazz){
return(T[])Array.newInstance(clazz,2);
}
公共静态void main(字符串[]args){
String[]strings=createArray(String.class);
字符串[0]=“你好”;
字符串[1]=“世界”;
System.out.println(Arrays.toString(strings));
}
}

我在这里使用的是静态方法,但它也适用于实例方法。请注意,main方法中的调用不需要强制转换。

请注意
Array.newInstance(klazz,3,4,5)
(带有
int.
参数)将
newt[3][4][5]
,因此这个非常通用的方法只能返回
对象。因此需要在调用时进行强制转换。@JoopEggen:我之所以调用
数组.newInstance
是因为它是设置SSCCE的第一件事(而不是调用不存在的
方法来从反射(c)
创建数组)。我想在这种情况下可能会有点混乱。我的评论并不是批评,对于许多新手来说,这是一个很好的回答,一个新的玩家,数组。只是想解释对强制转换的需要,并展示它的多维功能。请注意,
Array.newInstance(klazz,3,4,5)
(带有
int.
参数)将
newt[3][4][5]
,因此这种非常通用的方法只能返回
对象。因此需要在调用时进行强制转换。@JoopEggen:我之所以调用
数组.newInstance
是因为它是设置SSCCE的第一件事(而不是调用不存在的
方法来从反射(c)
创建数组)。我想在这种情况下可能会有点混乱。我的评论并不是批评,对于许多新手来说,这是一个很好的回答,一个新的玩家,数组。我只是想解释一下强制转换的必要性,并展示它的多维功能。当我从(T[])对象强制转换时,我得到了一个ClassCastException。如何创建给定类的数组?你确定它是一个填充了此类实例的数组吗?当我从(T[])对象强制转换时,我得到了一个ClassCastException如何创建给定类的数组?您确定它是一个填充了此类实例的数组吗?