了解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类型的对象。
如果你想为不同的类型做不同的事情,它仍然是通用的吗?