使用泛型时,我在Java中有一个小问题。我有一堂课A:
A
public class A<T>
在方法中A,我需要获取类型名称T。有没有办法找到字符串s使用T?
T
s
(如果创建了A<String> temp = new A<String>();,我希望能够做到java.lang.String这一点- 我必须使用通用性,因为我的方法之一必须返回List<T>)。
A<String> temp = new A<String>();
java.lang.String
List<T>
这似乎很容易,但是我不知道如何去做。
由于 类型擦除, 您通常无法执行此操作-的实例A<String>不 知道 的类型T。如果需要,一种方法是使用类型文字:
A<String>
public class A<T> { private final Class<T> clazz; public A<T>(Class<T> clazz) { this.clazz = clazz; } // Use clazz in here }
然后:
A<String> x = new A<String>(String.class);
这很丑陋,但这就是类型擦除的作用:(
另一种选择是使用类似Guice的东西TypeLiteral。之所以有效,是因为不会删除用于指定 超类 的type参数。因此,您可以执行以下操作:
TypeLiteral
A<String> a = new A<String>() {};
a现指 _子类_的A<String>通过获取,所以a.getClass().getSuperClass()你最终可以得到回String。不过,这太可怕了。
a
a.getClass().getSuperClass()
String