泛型类 - getClass()。getName()

时间:2012-02-23 16:23:04

标签: java generics

我有一个通用的基类:

public class BaseLabel<T> extends JXLabel {
    private static final long serialVersionUID = 1L;

    public BaseLabel() {
        System.out.println(T.class.getClass().getName()); //error
    }       
}

和儿童班:

public class ChildLabel extends BaseLabel<ChildLabel> {
    private static final long serialVersionUID = 2L;

    public ChildLabel() {

    }       
}

我收到编译错误。

有没有办法从BaseClass的构造函数中获取实际的类名。在这里,通过实际的类我指的是我要实例化的那个类。

例如,我正在实例化ChildClass,ChildClass clz = new ChildClass();

然后println()将打印package.ChildClass

提前致谢。


编译错误是:

cannot select from a type variable System.out.println(T.class.getClass().getSimpleName());

如果我从this.getClass.getSimpleName()的构造函数中调用abstract BaseClass。正在打印ChildClass

为什么?

是否因为我正在实例化ChildClass所以这指向ChildClass的对象。

3 个答案:

答案 0 :(得分:7)

丑?是

import java.lang.reflect.ParameterizedType;


public class GenericClass<T> {

    public GenericClass() {
        System.out.println(getClass().getGenericSuperclass()); //output: GenericClass<Foo>
        System.out.println(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]); //output: class Foo
    }

    public static void main(String[] args) {
        new ChildClass();
    }

}

儿童班

import java.lang.reflect.ParameterizedType;


public class ChildClass extends GenericClass<Foo> {

    public ChildClass() {
        System.out.println(((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]); //output: class Foo
    }

}

答案 1 :(得分:3)

在运行时无法从类BaseLabel中找到此信息,因为它不知道它的实例已被实例化的类型。这是因为Java使用类型擦除来表示泛型 - 泛型参数不是运行时伪像。

答案 2 :(得分:0)

((Class<?>)((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0]).getName();

做完了。