gpt4 book ai didi

java - 如何检查泛型类是否正在实现某个接口(interface)

转载 作者:搜寻专家 更新时间:2023-11-01 02:36:16 25 4
gpt4 key购买 nike

我有这门课:

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) ):

Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter.

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com