提问者:小点点

如何检查java.reflect.Type值是否是泛型类的子类?


我有一个方法,它给我一个对象的类型:

public void decode(java.reflect.Type type){
      //how to check if type extends MyAbstract.class?
}

如果类型扩展了我创建的抽象类MyAbstract,我需要进行强制转换。 我试过:

type instanceof MyAbstract

但似乎不起作用。。。你有什么想法吗?


共1个答案

匿名用户

首先,要澄清几点:

>

  • 类型实例不仅代表类。 它可以表示类,参数化类型以及类型参数本身。 它甚至可以表示通配符类型。 如果查看javadoc,您将看到以下已知的子接口:

    GenericArrayTypeParameterizedTypeTypeVariableWildcardType

    instanceof检查其左操作数是否是指定为其右操作数的类型的实例。 您的

    type instanceof MyAbstract
    

    因为它检查type变量引用的对象是否是自定义MyAbstract类型的实例。 您可能还没有实现一个也扩展了您的MyAbstractType子类(但您可能会让我吃惊)。

    java.lang.class类型也实现了type。 如果这是您真正要检查的内容,那么您首先必须将其强制转换为class,然后使用IsAssignableFrom检查MyAbstract是否是该类型的超类。

    if (type instanceof Class) {
        Class<?> clazz = (Class<?>) type;
        if (MyAbstract.class.isAssignableFrom(clazz)) {
            System.out.println(true);
        }
    }
    

    如果您的类型不是一个,您必须对它是什么进行推理。 如果它是一个ParameterizedType,您可以使用它的GetRawType方法来获取原始类型(但是您必须重复检查Class)。 如果它是TypeVariable,则可以使用getBounds()检查它的边界。