如何检查泛型类是否正在实现某个接口

时间:2018-06-14 10:26:36

标签: java generics casting

我有这堂课:

public class Bird extends AbstractEntity<Long> implements IHasWings {
}

其他一些扩展AbstractEntity的类但他们没有实现IHasWings,例如:

public class Cat extends AbstractEntity<Long>{
}

我将这些类作为DAO classe中的类型参数传递,如下所示:

public class BirdDAO extends AbstractDAO<Bird, Long> { ... }

public class CatDAO extends AbstractDAO<Cat, Long> { ... }

所以所有DAO类都在扩展AbstractDAO类。

AbstractDAO课程中我有这个:

public abstract class AbstractDAO<T extends AbstractEntity<ID>, ID extends Serializable> { 
    public List<T> findAll(){ 
        AbstractEntity entity = ...
        if (entity instanceof IHasWings) {
            IHasWings entityWithWings = (IHasWings) entity;
            //Do something with entityWithWings.getWingSize();
        }else{
            //Do something else
        }
    }
}

我想测试传递的类型参数是否正在实现IHasWings,如上所示,但我无法找到方法。

我尝试了以下内容:

Class<T> entity = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
    .getActualTypeArguments()[0];
if (entity instanceof IHasWings) {...}

引发了这个错误:Incompatible conditional operand types Class<T> and IHasWings

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您的检查不正确,因为它验证Class<?>的实例是IHasWings的实例。编译器使用没有关系的对象和类型阻止instanceof检查(java.lang.Class对象永远不能是IHasWings接口的实例。

您正在寻找的方法是找出IHasWings是否与entity中的类对象兼容。为此,您需要的是:

IHasWings.class.isAssignableFrom(entity)

来自javadocsjava.lang.Class.isAssignableFrom(Class<?> cls)):

  

确定此Class对象所表示的类或接口是否与指定的Class参数所表示的类或接口相同,或者是它们的超类或超接口。

相关问题