Java 参数为ArrayList<;T>;我怎样才能得到T';s类名称
参数是ArrayListJava 参数为ArrayList<;T>;我怎样才能得到T';s类名称,java,generics,Java,Generics,参数是ArrayList如何获取T的类名 public static <T extends Object> void test(ArrayList<T> list){ T temp; Class classType=temp.getClass(); System.out.println(classType.getName()); } 公共静态无效测试(ArrayList列表){ 温度; Class classType=t
如何获取T的类名
public static <T extends Object> void test(ArrayList<T> list){
T temp;
Class classType=temp.getClass();
System.out.println(classType.getName());
}
公共静态无效测试(ArrayList列表){
温度;
Class classType=temp.getClass();
System.out.println(classType.getName());
}
编译失败:局部变量temp可能尚未初始化
但是如何获取模板类的类名。您不能,因为Java泛型实现中存在类型擦除。当您需要了解类时,典型的技巧是将类作为单独的参数传递,称为“type token”,如下所示:
public static <T extends Object> void test(ArrayList<T> list, Class<T> classType) {
}
公共静态无效测试(ArrayList列表,类类型){
}
在中详细讨论了此技巧(参见页面底部的示例)。您无法获得泛型类型。这是由于泛型是如何在Java中实现的(使用类型擦除)。基本上,您只能在编译时使用泛型捕捉类型错误 您的代码无法编译,因为您试图对尚未初始化的局部变量调用
getClass
你可以做的是:
- 除了列表之外,还传入一个
参数,告诉方法要使用的类型类
- 或者查看列表的第一个元素(如果存在),并相信其运行时类型具有足够的代表性(可能没有)
public static <T extends Object> void test(ArrayList<T> list){
if(null!=list && !list.isEmpty())
System.out.println(list.get(0).getClass().getName());
}
公共静态无效测试(ArrayList列表){
if(null!=list&&!list.isEmpty())
System.out.println(list.get(0.getClass().getName());
}
如果(1)列表为空(即使您将其装箱,使其不会崩溃,但仍无法解决任务),(2)第一个元素为空,或者(3)第一个元素的类实际上是t的子类,这将给出错误的答案,则此操作不起作用