访问参数化类型的类名

时间:2012-01-23 14:07:01

标签: java generics

我有一个参数化类。我想获得类名所代表的类的名称。例如,我想要做的是:

public T foo(){
    System.out.println(T.class.getName());
}

3 个答案:

答案 0 :(得分:2)

你不能这样做,因为在编译时不知道T。你可以实现类似的东西:

public void foo(T t) {
    System.out.println(t.getClass().getName());
}

请注意,这会占用T的实例,并会打印出动态类型的名称。

这是否足够好取决于您的使用案例。

答案 1 :(得分:1)

Java泛型不能那样工作。如果T上有任何边界,则可以通过查询类型变量定义来访问边界。 E.g:

public class Foo<T extends Bar>{}

可以让您获得Bar,但不会获得您实际使用的Bar子类型。它不起作用,抱歉。

阅读Java Generics FAQ了解详情。

BTW:这个问题的一个常见解决方案是将T的子类型传递给您的类,例如

public T foo(Class<? extends T> tType){
    System.out.println(tType.getName());
}

我知道它很麻烦,但它是所有Java泛型允许的。

答案 2 :(得分:0)

public T foo(T t){
    System.out.println(t.getClass().getName());
}