簡體   English   中英

如何使用其鍵和值屬於某個層次結構的通用映射?

[英]How to work with a generic map whose key and values belong to a certain hierarchy?

我的目標是創建一個Map,其鍵是Class實例,其值是相應Class的實例。 含義,

Map(層次結構中的某個類 - >其對應的實例)

為此,我宣布Map為

Map<Class<? extends BaseService>, ? extends BaseService> serviceMap = 
    new HashMap<Class<? extends BaseService>, BaseService>();
//Assume BaseService is at the root of hierarchy.

以上編譯。

為了填充Map,我使用了

public <T extends BaseService> void register(T service) {   
    serviceMap.put(service.getClass(), service);    
}

這不編譯。

我該如何工作? 為什么不編譯?

您對通配符的使用與您的英語定義不完全一致。 當你定義:

Map<Class<? extends BaseService>, ? extends BaseService> serviceMap;

這可能被描述為“ serviceMap是一個從類擴展BaseService的映射到某種類型的值(它是BaseService或子類)”。

編譯器在此上下文中拒絕您的register方法是正確的。 serviceMap的值類型被聲明為“某種東西” - 因此您可以使用值類型ServiceImplOne輕松地為其分配映射。 並且可以使用類ServiceImplTwo的參數調用您的register方法。 您無法將其插入到地圖中,因為它與通用參數不一致!

很明顯,由於您希望能夠插入任何類型的服務,因此映射必須接受BaseService所有實例作為值,而不是BaseService 某些 (未知)子類型。 因此,您可以通過使用具體值類型聲明地圖來解決此問題:

Map<Class<? extends BaseService>, BaseService> serviceMap;

暫無
暫無

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

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