Java 如何在泛型静态方法中获取类型的字符串表示形式

Java 如何在泛型静态方法中获取类型的字符串表示形式,java,generics,Java,Generics,给定Java中的以下方法: public static <U> void foo() { } publicstaticvoidfoo(){ } 在这个方法中,如何获得U类型的SimpleName或CanonicalName?您不能。该类型在运行时不可用。泛型类型参数将经历一个称为的过程,编译器将清除泛型类型,就像它不存在一样,以实现向后兼容性。不会,除非您也传递了该类 public static <U> void foo(Class<U> clazz

给定Java中的以下方法:

public static <U> void foo() {


}
publicstaticvoidfoo(){
}

在这个方法中,如何获得U类型的
SimpleName
CanonicalName

您不能。该类型在运行时不可用。泛型类型参数将经历一个称为的过程,编译器将清除泛型类型,就像它不存在一样,以实现向后兼容性。

不会,除非您也传递了该类

public static <U> void foo(Class<U> clazz ){
  System.out.println( clazz.toString() );
}
publicstaticvoidfoo(类clazz){
System.out.println(clazz.toString());
}

这样做的原因是泛型在编译期间被擦除,因此不能在运行时使用它们。有关类型擦除的更多信息,请参见。您必须将类作为参数传递:

public static <T> void foo(Class<T> klass) {
    System.out.println(klass.getCanonicalName());
    System.out.println(klass.getSimpleName());
}
publicstaticvoidfoo(klass类){
System.out.println(klass.getCanonicalName());
System.out.println(klass.getSimpleName());
}
没有其他方法,因为Java泛型的擦除,您没有对参数化类型信息的运行时访问权。

因为,您不能。引用本教程:

当一个泛型类型被实例化时,编译器通过一种称为类型擦除的技术来翻译这些类型——在这个过程中,编译器会删除与类或方法中的类型参数和类型参数相关的所有信息。类型擦除使使用泛型的Java应用程序能够与在泛型之前创建的Java库和应用程序保持二进制兼容性


在Java中,泛型类型会被删除,因此运行时
U
会变成
Object
。我知道这个选项,我希望避免额外的参数。所有这些都是很好的响应,首先要感谢Mark的点击,感谢Oscar的选择,以及Ted最简洁的回答。