获取泛型变量的参数化类型类

时间:2015-04-25 13:06:47

标签: java

public class Foo {

    public <T> void foo(final T t) {
        final Class<T> clazz = (Class<T>) t.getClass();
    }

}

我无法理解为什么t.getClass()会返回Class<?>而不是Class<T>(或Class<? extends T>),为什么我需要进行投射。

这种演员会以哪种方式失败?

2 个答案:

答案 0 :(得分:0)

Java中的泛型是使用类型擦除实现的。

类型T在运行时不存在,编译器将T替换为java.lang.Object 。所以下面的方法实际上是用字节码编译的:

public void foo(final Object t)

答案 1 :(得分:0)

你应该查找“类型擦除”一词。 Java做泛型的方式是编译“通用”代码。也就是说,它编译可以使用任何类型的代码,并在编译时进行类型检查。