2016-11-12 59 views
1

我很難創建CodeService接口的實現類。如何將類類型用作映射鍵和類的值列表作爲映射值?

public interface CodeService<T extends AbstractCode> { 
    Map<Class<T>, List<T>> getCodes(); 
} 

AbstractCode是我的國家,城市和它在我的數據庫中的相應表名性別類的抽象超類。

getCodes()方法應該返回類型爲鍵的映射(Country.class,City.class,Sex.class)和由數據庫返回的所有國家,城市和性別的列表作爲值。

我的getCodes()方法的實現如下:

public class HibernateCodeService<T extends AbstractCode> implements CodeService<T> { 
    private Map<Class<T>, List<T>> map = new HashMap<Class<T>, List<T>>(); 

    public Map<Class<T>, List<T>> getCodes() { 

     /* Create an instance of the HibernateCodeDao<Sex> class */ 
     CodeDao<Sex> sexDao = new HibernateCodeDao<Sex>(); 

     /* Set the class type as Sex.class */ 
     Class<Sex> type = Sex.class; 

     /* Fetch all the sex values from the database */ 
     List<Sex> list = sexDao.fetchAll(Sex.class); 

     /* Put the Sex.class as the map key, list of sexes as the value */ 
     map.put(type, list); 

     /* Same code for Country and City classes */ 

     return map; 
    } 
} 

但是,IDE的map.put(type, list)行發出錯誤。

put (java.lang.Class<T>, java.util.List<T>) in Map cannot be applied to (java.lang.Class<Sex>, java.util.List<Sex>)

我的問題是,我怎麼能存儲類類型作爲關鍵的IM我的地圖,這樣我可以獲取這個類的所有值的列表?

+0

對於這是值得的,這是一個有趣的仿製藥練習,但作爲一個實際操作,至少是非常有問題的。 – chrylis

回答

1

如果我要實例化一個HibernateCodeService<Country>的實例,那麼您的地圖將通過您的參數爲Map<Class<Country>, List<Country>>。由於CountrySex不相關,這意味着它不允許插入到您的地圖中。

現在,對於您要完成的任務,您對泛型的使用將不起作用。因爲你的地圖的關鍵是Class<T>,這意味着你的地圖每個實例只能包含一個可能的值,這有點會破壞你的地圖的目的。雖然我與@chrylis,這是不是在生產製做一件好事同意,你就可以完成你打算從你的接口消除仿製藥完成什麼,和你的方法的返回:

public interface CodeService { 
    Map<Class<? extends AbstractCode>, List<? extends AbstractCode>> getCodes(); 
} 
+0

謝謝你的回答,這是一個我不得不創建的實踐項目,所以除了更好地瞭解泛型外,並沒有任何用處。 :)另外,你能解釋爲什麼這不適合現實生活中的項目嗎? – Kuyss

+1

對於現實生活中的系統而言,這有兩個原因。首先,從接口名稱不清楚特定實現支持哪些類類型,哪些不支持。在'AbstractCode'下創建新的子類很快就會變得非常混亂。其次,涉及投射的任何事情(必須由該方法的用戶完成)通常是一種冒險的舉動。理想情況下,您的界面應該爲其支持的每種返回類型提供單一方法。 –

+0

關於第二點,實現此接口的正確方法是爲每個擴展AbstractCode的類提供一個方法,並返回該特定類的值列表? – Kuyss