簡體   English   中英

如何通過他們實現的接口找到實例?

[英]How to find the instance by the interface they implements?

我有 2 個 java 類從 2 個接口擴展,它們的繼承關系如下:

interface Base{}
interface Sub extends Base{}

class BaseImpl implements Base{}
class SubImpl implements Sub{}

然后我有一個經理 class 來提供 add 和 findByClass 方法。

class Manager{
    List<Object> list = new ArrayList<>();

    public void add(Object o){
        list.add(o);
    }

    public List<Object> findByClass(Class clazz){
        //todo: add find logic
    }
}

我將 BaseImpl 和 SubImpl 的實例添加到 Manager 並希望通過接口 class 查詢它們,如下所示:通過基本接口 class 查詢時返回 BaseImpl 和 SubImpl,僅在通過子接口 ZA2F2ED4F8EBDCC2CBB4C21A29 查詢時返回 SubImpl

    Manager m = new Manager();
    m.add(new BaseImpl());
    m.add(new SubImpl());

    m.findByClass(Base.class); //return BaseImpl and SubImpl
    m.findByClass(Sub.class); //return SubImpl only!
    

我的問題是如何在 Manager 中實現 findByClass 方法?

new BaseImpl().getClass();

這是執行BaseImpl.class的一種愚蠢方法 - 不需要無參數構造函數,不需要非抽象 class,並且不會創建無意義的實例。

Class<? extends BaseImpl>

同樣,不必要的復雜。

寫吧:

Class<BaseImpl> base = BaseImpl.class;

如何從 class 實例中獲取繼承關系?

base.getSuperclass()base.getInterfaces()是您想要的方法。 您必須遞歸地反復調用它,直到您為basesub創建了所有類型的完整列表,然后您可以檢查是否存在重疊。

這是一件很奇怪的事情,所以也許你想退后一步,解釋為什么你認為你需要這個。 簡單地說,所有總是共享“關系”,因為一切都擴展java.lang.Object

如果您只想知道例如SubImpl.class是否是 BaseImpl 的子類型,則有一種方法:

System.out.println(BaseImpl.class.isAssignableFrom(SubImpl.class));
> true

您可以使用Class#getSuperClass()來獲取 class 的超類:

System.out.println(SubImpl.class.getSuperClass() == BaseImpl.class); // true
System.out.println(new SubImpl().getClass().getSuperClass() == new BaseImpl().getClass()); // true

暫無
暫無

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

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