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