Java泛型 - 获取类?

ryy*_*yst 77 java generics

我有一个列表,编程如下:public class MyList<T>.有没有办法使用T变量来获取类的名称(所以我可以从内部MyList知道T是字符串,套接字等)?

编辑:没关系,在这里找到答案.

duf*_*ymo 113

简答:你做不到.

答案很长:

由于泛型在Java中的实现方式,泛型类型T不会保留在运行时.您仍然可以使用私有数据成员:

public class Foo<T> 
{
    private Class<T> type;

    public Foo(Class<T> type) { this.type = type; } 
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

Foo<Integer> test = new Foo<Integer>(Integer.class);
Run Code Online (Sandbox Code Playgroud)


wut*_*aer 56

我喜欢这个解决方案

http://www.nautsch.net/2008/10/28/class-von-type-parameter-java-generics/

public class Dada<T> {

    private Class<T> typeOfT;

    @SuppressWarnings("unchecked")
    public Dada() {
        this.typeOfT = (Class<T>)
                ((ParameterizedType)getClass()
                .getGenericSuperclass())
                .getActualTypeArguments()[0];
    }
...
Run Code Online (Sandbox Code Playgroud)

  • 这仅在运行时类是通用超类的直接子类时才有效. (15认同)
  • 线程“main”中的异常 java.lang.ClassCastException:java.lang.Class 无法转换为 java.lang.reflect.ParameterizedType (5认同)

And*_*ite 25

您正在查看Type Erasure的结果.从那页...

当实例化泛型类型时,编译器通过称为类型擦除的技术来转换这些类型 - 这是一种编译器删除与类型参数相关的所有信息并在类或方法中键入参数的过程.类型擦除使得使用泛型的Java应用程序能够维护与泛型之前创建的Java库和应用程序的二进制兼容性.

例如,Box <String>被转换为Box类型,它被称为原始类型 - 原始类型是没有任何类型参数的泛型类或接口名称.这意味着您无法找到泛型类在运行时使用的Object类型.

这也看起来像这个问题也有很好的答案.