2016-06-13 118 views
2

有了這個接口:如何使用泛型實現ServiceLocator?

public interface ServiceLocator { 
    <T> void setService(Class<T> klass, Factory<T> factory) 

    <T> void setConstant(Class<T> klass, T value) 

    <T> T getObject(Class<T> klass) 

} 

如何實現呢?我的意思是,我如何申報結構數據? 這是正確的嗎?

private Map<Class, Factory> services = new HashMap<>(); 
private Map<Class, Object> constants = new HashMap<>(); 
+1

就是這樣,你還可以添加通配符擺脫原料型的警告。 '''地圖,工廠>''。 –

+0

但是,不是使用泛型有安全類型的要點?我引用了我的具有Object類型的'constants'聲明。有了這個,當我做一個常量的'getObject'時,我不得不做一個強制轉換:'(T)constants.get(klass);'那是不對的,不是嗎? – anat0lius

+0

您無法通過類型系統獲得該級別的安全性。但是你已經(大部分)以封裝的形式存在。 –

回答

0

解決方案:

private Map<Class<?>, Factory<?>> services = new HashMap<>(); 
private Map<Class<?>, Object> constants = new HashMap<>(); 

添加-Xlint:unchecked指令編譯器選項。 和@SuppressWarnings("unchecked")您需要它的方法。在我的情況是在getObject方法。

0
private Map<Class, Factory> services = new HashMap<>(); 
private Map<Class, Object> constants = new HashMap<>(); 

如果你想使用這個結構可以這樣聲明它:

private Map<Class<?>, Factory<T>> services = new HashMap<>(); 
private Map<Class<?>, Object> constants = new HashMap<>(); 

記得把Factory<T>趕上類型。 使用類爲您提供使用AnyClass.class作爲重點

順便說一句,你可以把所有在一個地圖就像private Map<Class<?>, Object>和get函數投它,如果它是一個工廠或沒有;)

+0

地圖,工廠> services'它是不可能的,因爲我不希望實現是通用的,只有方法。把所有的地圖放在一個地圖上是一種選擇,但我更喜歡其他方式,它是一樣的,但更清潔,不是嗎? – LiLou1

+0

嗯,是的,如果是這種情況,它會更乾淨,有兩張地圖;) – Raskayu

0

番石榴具有旨在用於類似目的的接口:ClassToInstanceMap<B>。 API是:

<T extends B> T getInstance(Class<T> type); 
<T extends B> T putInstance(Class<T> type, T value); 

MutableClassToInstanceMap.java實施來看,我們可以看到,它採用了HashMap<Class<? extends B>, B>包裹在ConstrainedMap。它MapConstraint使用java.lang.Class.cast()確保地圖中所有的值是其對應的鍵的法律實例。

由於B往往只是Object,實施的HashMap最終只是被一個HashMap<Class<? extends Object>, Object>