在Java中给出以下方法:
public static <U> void foo() {
}
在此方法中,我如何获得U类型的SimpleName
或CanonicalName
?
答案 0 :(得分:3)
您必须将该类作为参数传递:
public static <T> void foo(Class<T> klass) {
System.out.println(klass.getCanonicalName());
System.out.println(klass.getSimpleName());
}
没有别的方法,因为Java泛型的擦除,你没有对参数化类型信息的运行时访问。
答案 1 :(得分:1)
你做不到。该类型在运行时不可用。通用类型参数经历一个名为type erasure的过程,由此编译器会删除泛型类型,就好像它不存在一样,以便向后兼容。
答案 2 :(得分:1)
不是,除非你也通过了这门课程
public static <U> void foo(Class<U> clazz ){
System.out.println( clazz.toString() );
}
这样做的原因是在编译期间擦除了泛型,因此您无法在运行时使用它们。有关“类型擦除”
的详细信息,请参阅this document答案 3 :(得分:1)
由于type erasure,你不能。引用教程:
当实例化泛型类型时,编译器通过名为 type erasure 的技术转换这些类型 - 编译器删除与类型参数相关的所有信息并在类或方法中键入参数的过程。类型擦除使得使用泛型的Java应用程序能够维护与泛型之前创建的Java库和应用程序的二进制兼容性。