我有一个通用的基类:
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
的对象。
答案 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();
做完了。