我有这门课:

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

还有一些扩展 AbstractEntity 但它们没有实现 IHasWings 的其他类,例如:
public class Cat extends AbstractEntity<Long>{
}

我在它们的 DAO 类中将这些类作为类型参数传递,如下所示:
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
我该如何解决这个问题?

最佳答案

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

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

IHasWings.class.isAssignableFrom(entity)

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

关于java - 如何检查泛型类是否正在实现某个接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50855267/

10-11 01:12