我有一个通用类,说:
MyClass<T>
在这个类的方法中,我想测试T的类型,例如:
void MyMethod()
{
if (T == String)
...
if (T == int)
...
}
我该怎么做?
感谢您的帮助
答案 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 values和check 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)
如果你想为不同的类型做不同的事情,它仍然是通用的吗?