了解Java中的generics类型

我有一个通用类,说:

MyClass 

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

 void MyMethod() { if (T == String) ... if (T == int) ... } 

我怎样才能做到这一点 ?

谢谢你的帮助

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

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

 public MyClass { private final Class clazz; public MyClass(Class clazz) { this.clazz = clazz; } public void myMethod() { if (clazz == String.class) { ... } } } 

请注意,Java不允许将基元用于类型参数,因此int不在…

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

 class A { List 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 

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

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

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

除了克莱特斯,我还有一个例外: 超级型代币 。 超类型令牌将保留类型信息。

new Type>() {}

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

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

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

可以解析类型参数值并检查是否可以使用一种类型代替另一种类型 。

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

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