了解Java中的泛型类型

时间:2009-12-11 08:46:43

标签: java generics

我有一个通用类,说:

MyClass<T>

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

void MyMethod()
{

    if (T == String)
        ...
    if (T == int)
        ...
}

我该怎么做?

感谢您的帮助

7 个答案:

答案 0 :(得分:10)

通常,由于类型擦除,你不能。有关详细信息,请参阅Angelika Langer's Java Generics FAQ

可以做的是将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)
        {
           ...
        }
    }
}

请注意,Java不允许将基元用于类型参数,因此int已经用完......

答案 1 :(得分: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());
    }
  }
}

输出:

list: java.util.List<java.lang.String>

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

public <T> T createObject(Class<T> clazz) {  
  return clazz.newInstance();
}

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

答案 2 :(得分:3)

除了我的一个例外,我还有一个例外:super type tokens。超类型令牌将保留类型信息。

new Type<Set<Integer>>() {}

可以使用Class.getGenericSuperClass检索类型信息。

答案 3 :(得分:1)

if (object instanceof String)
   System.out.println("object is a string");

答案 4 :(得分:0)

如前所述,您只能在静态字节代码级别获得与泛型相关的信息。

然后可以resolve type arguments valuescheck if one type may be used in place of another

答案 5 :(得分:0)

如果您的子类B extends A也应匹配方法clazz == A.class。不行。然后,您应该使用A.class.isInstance(b),其中b是B类型的对象。

答案 6 :(得分:0)

如果你想为不同的类型做不同的事情,它仍然是通用的吗?

相关问题