是否可以填充泛型列表并从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如何创建给定类的数组?您确定它是一个填充了此类实例的数组吗?