没有办法找到泛型的类类型吗?
if (T instanceof String) {
// do something...
}
以上肯定不编译。
泛型是一个编译时特性。泛型在编译时添加检查,这在运行时可能没有任何意义。这是一个例子。您只能检查引用的对象的类型,它可能是代码中的超类型。如果你想传递类型 T 你已经明确地这样做了。
void someMethod(Class<T> tClass) {
if(String.class.isAssignableFrom(tClass))
或者
void someMethod(Class<T> tClass, T tArg) {
注意:类型可能不一样,
someMethod(Number.class, 1);
它不会编译,因为 T 不是变量,而是在运行时定义的类的占位符。这是一个快速示例:
public class Test<T> {
public void something(T arg) {
if (arg instanceof String) {
System.out.println("Woot!");
}
}
public static void main(String[] args) {
Test<String> t = new Test<String>();
t.something("Hello");
}
}
如果你有子类
public class SomeClass extends SomeSubclass<String>{}
和
public class SomeSubclass<T> {}
那么有一种方法可以通过执行代码来发现 T 的类型
Type t = getClass().getGenericSuperclass()
if (t instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType)t).getActualTypeArguments()
// in simple cases actualTypeArguments will contain Classes, since Class implements Type
}
如果你的情况有点复杂(? extends String
)`看看org.ormunit.entity.AEntityAccessor#extractClass
如果您有特定字段,您可以像下面这样检查它:
private <T> String someMethod(T genericElement)
{
if (String.class.isInstance(genericElement))
{
return (String) genericElement;
}
...