簡體   English   中英

如何檢查泛型類是否正在實現某個接口

[英]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)

來自javadocsjava.lang.Class.isAssignableFrom(Class<?> cls) ):

確定此Class對象表示的類或接口是否與指定的Class參數表示的類或接口相同,或者是它們的超類或超接口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM