[英]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()
是您想要的方法。 您必須遞歸地反復調用它,直到您為base
和sub
創建了所有類型的完整列表,然后您可以檢查是否存在重疊。
這是一件很奇怪的事情,所以也許你想退后一步,解釋為什么你認為你需要這個。 簡單地說,所有類總是共享“關系”,因為一切都擴展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.