Java:instanceof Generic

时间:2011-01-16 10:47:15

标签: java generics instanceof

有没有办法找到泛型的类型?

if (T instanceof String) {
    // do something...
}

以上肯定不会编译。

4 个答案:

答案 0 :(得分:44)

泛型是一个编译时功能。泛型在编译时添加检查,这在运行时可能没有任何意义。这是一个例子。您只能检查引用的对象的类型,这可能是代码中的超类型。如果你想传递类型T,你可以明确地这样做。

void someMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 

void someMethod(Class<T> tClass, T tArg) {

注意:类型可能不一样,

someMethod(Number.class, 1);

答案 1 :(得分:4)

如果您有子类

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

答案 2 :(得分:3)

它不会编译,因为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");
}

}

答案 3 :(得分:1)

如果您有特定字段,可以像下面一样查看:

private <T> String someMethod(T genericElement)
{
    if (String.class.isInstance(genericElement))
    {
        return (String) genericElement;
    }
...