![](/img/trans.png)
[英]How to define a Map whose key and value is enforced to have a related hierarchy?
[英]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.