【问题标题】:How to check if java.reflect.Type value is a subclass of a generic class?如何检查 java.reflect.Type 值是否是泛型类的子类?
【发布时间】:2020-06-12 14:41:00
【问题描述】:

我有一个方法可以给我一个对象的类型:

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

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

type instanceof MyAbstract

但似乎不起作用...您有什么想法吗?

【问题讨论】:

标签: java reflection


【解决方案1】:

首先,澄清几点:

  1. Type 实例不仅代表类。它可以表示类、参数化类型以及类型参数本身。它甚至可以表示通配符类型。如果您查看javadoc,您会看到这些已知的子接口:

    GenericArrayTypeParameterizedTypeTypeVariable<D>WildcardType

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

    type instanceof MyAbstract
    

    不太有意义,因为它正在检查 type 变量引用的对象是否是您的自定义 MyAbstract 类型的实例。据推测,您还没有实现一个 Type 子类,它也扩展了您的 MyAbstract(但您可能会让我感到惊讶)。

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

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

如果您的Type 不是Class,您必须推理它是什么。如果它是ParameterizedType,您可能可以使用它的getRawType 方法来获取原始类型(但您必须重复检查Class)。如果是TypeVariable,你可以用getBounds()检查它的边界。

【讨论】:

    猜你喜欢
    • 2016-11-24
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2019-06-25
    • 1970-01-01
    相关资源
    最近更新 更多