如何在 Java 泛型中获取类型变量的类

2022-09-01 13:06:39

我见过类似的问题,但它们并没有多大帮助。

例如,我有这个泛型类:

public class ContainerTest<T>
{

    public void doSomething()
    {
        //I want here to determinate the Class of the type argument (In this case String)
    }
}

和另一个使用此容器类的类

public class TestCase
{

    private ContainerTest<String> containerTest;

    public void someMethod()
    {
        containerTest.doSomething();
    }
}

是否可以在方法 doSomething() 中确定类型参数的类,而无需在 ContainerTest 类中没有显式类型变量/字段或任何构造函数

更新:容器测试类的格式已更改


答案 1

唯一的方法是将类存储在实例变量中,并要求将其作为构造函数的参数:

public class ContainerTest<T>
{
    private Class<T> tClass;
    public ContainerTest(Class<T> tClass) {
        this.tCLass = tClass;
    }

    public void doSomething()
    {
        //access tClass here
    }
}

答案 2

如果你对反思方式感兴趣,我在这篇伟大的文章中找到了部分解决方案:http://www.artima.com/weblogs/viewpost.jsp?thread=208860

简而言之,您可以使用 和 方法,但您必须子类化一些父超类。java.lang.Class.getGenericSuperclass()java.lang.reflect.ParameterizedType.getActualTypeArguments()

以下代码段适用于直接扩展超类的类。有关更通用的解决方案,请参阅参考文章。AbstractUserType

import java.lang.reflect.ParameterizedType;


public class AbstractUserType<T> {

    public Class<T> returnedClass() {
        ParameterizedType parameterizedType = (ParameterizedType) getClass()
                .getGenericSuperclass();

        @SuppressWarnings("unchecked")
        Class<T> ret = (Class<T>) parameterizedType.getActualTypeArguments()[0];

        return ret;
    }

    public static void main(String[] args) {
        AbstractUserType<String> myVar = new AbstractUserType<String>() {};

        System.err.println(myVar.returnedClass());
    }

}