我有这门课:
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/