Java 参数为ArrayList<;T>;我怎样才能得到T';s类名称

Java 参数为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

参数是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=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

你可以做的是:

  • 除了列表之外,还传入一个
    参数,告诉方法要使用的类型
  • 或者查看列表的第一个元素(如果存在),并相信其运行时类型具有足够的代表性(可能没有)

似乎只需稍微包装一下你的“T”或橡皮擦就可以了。下面是与此相关的讨论

您可以尝试以下方法:

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的子类,这将给出错误的答案,则此操作不起作用