[英]How to hide Generic type parameters from implementing class of a Callback interface
[英]How to check if a generic type of class is implementing some interface
我有這門課:
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
我怎么解決這個問題?
您的檢查不正確,因為它驗證Class<?>
的實例是IHasWings
的實例。 編譯器使用沒有關系的對象和類型來阻止instanceof
檢查( java.lang.Class
對象永遠不能是IHasWings
接口的實例)。
您正在尋找的是一種了解IHasWings
是否與entity
的類對象兼容的方法。 為此,您需要的是:
IHasWings.class.isAssignableFrom(entity)
來自javadocs ( java.lang.Class.isAssignableFrom(Class<?> cls)
):
確定此Class對象表示的類或接口是否與指定的Class參數表示的類或接口相同,或者是它們的超類或超接口。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.