在Java中,TypeVariable可以转换为类对象吗?
我正在尝试实现此方法:在Java中,TypeVariable可以转换为类对象吗?,java,generics,reflection,Java,Generics,Reflection,我正在尝试实现此方法: public static <T> T[] convertListToArray(List<T> toConvert) { ... } publicstatict[]convertListToArray(List-toConvert){…} 但是我无法将列表对象转换为类对象,我需要该对象来实例化数组。由于“类型擦除”,我不确定这是否可能,但我想我会试试。以下是我在被卡住之前所走的路: public static <T> T[] co
public static <T> T[] convertListToArray(List<T> toConvert) { ... }
publicstatict[]convertListToArray(List-toConvert){…}
但是我无法将列表
对象转换为类
对象,我需要该对象来实例化数组。由于“类型擦除”,我不确定这是否可能,但我想我会试试。以下是我在被卡住之前所走的路:
public static <T> T[] convertListToArray(List<T> toConvert) throws Exception {
Class<?> curClass = Class.forName("thispackage.ListUtils");
Method method = curClass.getDeclaredMethod("convertListToArray", List.class);
Type[] typeArray = method.getGenericParameterTypes();
ParameterizedType listType = (ParameterizedType)typeArray[0];
Type[] genericTypes = listType.getActualTypeArguments();
TypeVariable genericType = (TypeVariable)genericTypes[0];
//Got stuck here, can a "TypeVariable" be converted to a "Class<?>"?
String genericName = genericType.getTypeName();
System.out.println(genericName); //Prints "T"
//this of course doesn't work, throws ClassNotFoundException at runtime
Class<?> arrayClass = Class.forName(genericName);
int size = toConvert.size();
T[] retArray = (T[])Array.newInstance(arrayClass, size);
return toConvert.toArray(retArray);
}
public static T[]convertListToArray(List-toConvert)引发异常{
Class curClass=Class.forName(“thispackage.ListUtils”);
方法Method=curClass.getDeclaredMethod(“convertListToArray”,List.class);
Type[]typeArray=method.getGenericParameterTypes();
ParameteredType listType=(ParameteredType)类型数组[0];
类型[]genericTypes=listType.getActualTypeArguments();
TypeVariable genericType=(TypeVariable)genericTypes[0];
//被困在这里,一个“类型变量”能转换成一个“类”吗?
字符串genericName=genericType.getTypeName();
System.out.println(genericName);//打印“T”
//这当然不起作用,在运行时抛出ClassNotFoundException
Class arrayClass=Class.forName(genericName);
int size=toConvert.size();
T[]retArray=(T[])Array.newInstance(arrayClass,size);
返回转换到预定(重新预定);
}
因此,是否有可能将
类型变量
转换为类
?关键是要弄清T的类型,尽管实际使用了此方法,但简单地说,这是可行的
@SuppressWarnings("unchecked")
public static <T> T[] convertListToArray(List<T> toConvert) throws Exception {
if (!toConvert.isEmpty()) {
Class<?> aClass = toConvert.get(0).getClass();
T[] t = (T[]) Array.newInstance(aClass, toConvert.size());
return toConvert.toArray(t);
}
return (T[]) toConvert.toArray();
}
@SuppressWarnings(“未选中”)
公共静态T[]convertListToArray(List-toConvert)引发异常{
如果(!toConvert.isEmpty()){
类aClass=toConvert.get(0.getClass();
T[]T=(T[])Array.newInstance(aClass,toConvert.size());
返回转换到阵列(t);
}
返回(T[])到convert.toArray();
}
No,但您可以声明第二个Class
类型的参数,并为其传递适当的参数。以防万一,您知道Collection已经有了这样的方法,对吗@SotiriosDelimanolis是真的,但是这个方法和List.toArray(我试图简化)差不多,所以我可能会放弃这个想法。@Coverst75如果可能的话,我打赌Collection会有这样一个方法……没有其他方法了。你想做的事是不可能的。数组在运行时强制执行该类型,而列表
在运行时甚至不知道t
(它只是一个列表
)。