在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
(它只是一个
列表
)。