了解Java中的泛型类型

Tim*_*Tim 4 java generics

我有一个通用类,说:

MyClass<T>
Run Code Online (Sandbox Code Playgroud)

在这个类的方法中,我想测试T的类型,例如:

void MyMethod()
{

    if (T == String)
        ...
    if (T == int)
        ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?

谢谢你的帮助

Jon*_*eet 11

通常,由于类型擦除,您不能.有关详细信息,请参阅Angelika Langer的Java Generics FAQ.

可以做的是将a传递给Class<T>你的构造函数,然后检查:

public MyClass<T>
{
    private final Class<T> clazz;

    public MyClass(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    public void myMethod()
    {
        if (clazz == String.class)
        {
           ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,Java不允许将基元用于类型参数,因此int也是如此...

  • 如果你正确地设计你的课程,你真的应该不需要. (4认同)
  • EW.Java对于这种事情很重要. (3认同)

cle*_*tus 8

因为类型擦除你不能......大多数.但是有一个例外.考虑:

class A {
  List<String> list;
}

public class Main {
  public static void main(String args[]) {
    for (Field field : A.class.getDeclaredFields()) {
      System.out.printf("%s: %s%n", field.getName(), field.getGenericType());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

list: java.util.List<java.lang.String>
Run Code Online (Sandbox Code Playgroud)

如果您需要类对象,这通常是您处理它的方式:

public <T> T createObject(Class<T> clazz) {  
  return clazz.newInstance();
}
Run Code Online (Sandbox Code Playgroud)

即通过传递类对象并从该类派生泛型类型.