2013-02-09 90 views
0

我想獲得的是可以安全地返回輸入類實例的東西。在我的情況下被用作服務提供者。代碼示例:類型安全服務getter類(返回參數化類型)

public class MyClass { 

    private Map<String, Object> mServices; 

    public MyClass() { 
     mServices = new HashMap<String, Object>(); 
     mServices.put(XmlService.class.getName(), new XmlService()); 
    } 

    public <E extends Object> E getService(Class<?> service) { 
     return (E) mServices.get(service.getName()); 
    } 
} 

我承認我不擅長參數化類型,我需要一些幫助。我沒有從地圖中獲取對象嗎?爲什麼我需要投入E,放棄類型安全? 有沒有辦法避免鑄造和/或壓制警告?

回答

1

不,不幸的是沒有辦法避免這種額外的沮喪。注意你的地圖的類型是Map<String, Object>Object - 這是所有Java編譯器都知道的值。你必須以某種方式聲明地圖具有不同類型的每個鍵。不可能。

但你的代碼可以簡化一下:

public <E> E getService(Class<E> service) { 
    return (E) mServices.get(service.getName()); 
} 

另一個稍有好轉涉及使用Class關鍵:

private Map<Class<?>, Object> mServices; 

public <E> E getService(Class<E> service) { 
    return (E) mServices.get(service); 
} 
+0

哦感謝您的改進! 如果我把Map mServices? 雖然編譯器給我一個put方法的錯誤。 – 2013-02-09 21:43:30

+1

@Kap:即使它有效,你會期待什麼? Map.get()會返回一些擴展Object的類(根據類型聲明)。你不需要這個額外的''?延伸'知道這一點。 – 2013-02-09 21:45:34

0

這應該沒有喪氣工作:

public class ServiceLoader<T extends AbstractService> { 

private Map<String, T> services = new HashMap<String, T>(); 

T getService(Class<T> componentType) { 
    return services.get(componentType.getName()); 
} 
+0

是的,這會起作用,但我需要每種類型都有一個Service類。對?我想要的是一個集中的Service getter。 – 2013-02-09 21:52:39