簡體   English   中英

如何檢索父接口的實現類/接口?

[英]How to retrieve implementing class/interface of parent interface?

我對oop的多態性和繼承概念很清楚,但是我處於需要了解實現類的情況。 例如:

public CommonReadRepository<?> getReadRepository(String tableName) {
        if (tableName == null)
            return null;
        switch (tableName) {
        case "order":
            return orderRepository;
        ...
        }
        return null;
    }

接口orderRepository擴展了CommonReadRepository ,並且由於我的要求,我需要訪問在orderRepository中定義的函數。

CommonReadRepository<?> repository=getReadRepository("order");

有什么辦法可以檢查CommonReadRepository的實現(子)類或接口嗎?

當然,我總是可以這樣做:

if(tableName=="order")
return (OrderRepository)CommonReadRepository<?>;

我嘗試調試getReadRepository("order") ,但是它給了我JdkDynamicAopProxy的實例,我不確定它是如何工作的。

if(interface是instancey xyz類的)我不想使用它,因為我有100個類,並且我想保留它作為最后的手段...換句話說,我對xyz類不了解

謝謝

以下是一種檢查返回的Object是否為指定類的實例的方法:

CommonReadRepository<?> repository=getReadRepository("order"); if(repository instanceof WhatEverSubclass) { // do something }

但是,使用這種方法並不是應該實現OOP。 如果您的類都實現相同的接口,那么為什么不定義一個通用方法,該方法將在所有子類中使用,但是每次都以不同的方式實現。

我認為,您嘗試做的事情不會帶您到任何地方。

您可以使用反射工具( https://github.com/ronmamo/reflections )找到繼承接口的所有可用類。 我將其用於依賴項注入器,並且工作非常可靠。

但是,為什么不只使用instanceof運算符來確保對象的類型正確:

if( repository instanceof OrderRepository) return (OrderRepository)repository;

但是,這仍然不會改變函數的返回類型,您需要在函數外部再次檢查返回值的類型。

更新:如果針對數百個對象發生這種情況,則可以更改getRepository方法以返回作為參數給出的類型: <T> getRepository(String name, Class<T> expectedType)

這將允許您OrderRepository o = getRepository("order", OrderRepository.class);

暫無
暫無

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

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