我有这堂课:
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
我该如何解决这个问题?
答案 0 :(得分:4)
您的检查不正确,因为它验证Class<?>
的实例是IHasWings
的实例。编译器使用没有关系的对象和类型阻止instanceof
检查(java.lang.Class
对象永远不能是IHasWings
接口的实例。
您正在寻找的方法是找出IHasWings
是否与entity
中的类对象兼容。为此,您需要的是:
IHasWings.class.isAssignableFrom(entity)
来自javadocs(java.lang.Class.isAssignableFrom(Class<?> cls)
):
确定此Class对象所表示的类或接口是否与指定的Class参数所表示的类或接口相同,或者是它们的超类或超接口。