Java 泛型类-getClass().getName()

Java 泛型类-getClass().getName(),java,generics,Java,Generics,我有一个通用基类: public class BaseLabel<T> extends JXLabel { private static final long serialVersionUID = 1L; public BaseLabel() { System.out.println(T.class.getClass().getName()); //error } } 如果我从抽象基类的构造函数调用this.getClass

我有一个通用基类:

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

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

如果我从
抽象基类的构造函数调用
this.getClass.getSimpleName()
。它正在打印
ChildClass

为什么?


这是因为,当我实例化
ChildClass
时,它指向
ChildClass
的对象。

在运行时无法从类
BaseLabel
中找到此信息,因为它不“知道”实例化它的泛型类型。这是因为Java对泛型使用类型擦除-泛型参数不是运行时人工制品。

?对

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;
公共类泛型类{
公共泛型类(){
System.out.println(getClass().getGenericSuperclass());//输出:GenericClass
System.out.println(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]);//输出:类Foo
}
公共静态void main(字符串[]args){
新的子类();
}
}
儿童班

import java.lang.reflect.ParameterizedType;


public class ChildClass extends GenericClass<Foo> {

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

}
import java.lang.reflect.ParameterizedType;
公共类ChildClass扩展了GenericClass{
公共儿童班(){
System.out.println(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]);//输出:类Foo
}
}
((类)((参数化类型)clazz.getGenericSuperclass()).getActualTypeArguments()[0]).getName();

完成了任务。

您要求的信息在编译时无法获得,据我所知,您试图做的是不可能的。但是,即使在运行时,您也会遇到获取此信息的Java通用限制。请阅读这篇文章,特别是关于泛型和类型擦除的部分:编译错误是怎么说的?@Thomas我已经更新了这个问题。@ewok,是的,我正在导入JXLabel。@装满鳗鱼的气垫船谢谢你的解释。我已经编辑了我的问题。@Matthewspeep非常感谢您的解释。如果我从抽象基类的构造函数调用这个.getClass.getSimpleName()。它正在打印ChildClass。你能告诉我为什么会这样吗?这是因为当我实例化ChildClass时,它指向ChildClass的对象。Java方法是动态解析的(使用对象的运行时类)。getClass()调用仍然知道该对象最终是一个
ChildLabel
,即使该代码在
BaseLabel
中调用。
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
    }

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