2016-06-10 33 views
0

如果我寫這個函數:返回從一個普通的功能的專門的實現通用接口的無「未選中」警告

static <T> T getDefaultValue(Class<T> tClass) { 
    if(tClass == Integer.class) // or isAssignableFrom 
     return (T)Integer.valueOf(0); 
    ... 
} 

我得到警告Type safety: Unchecked cast from Integer to T,因爲仿製藥將被刪除。我可以用Class.cast繞過它:

static <T> T getDefaultValue(Class<T> tClass) { 
    if(tClass == Integer.class) 
     return tClass.cast(Integer.valueOf(0)); 
    ... 
} 

但我不能找到一個方法來返回基於功能的通用參數泛型類型:

interface Thing<T> {...} 
class ThingForInteger implements Thing<Integer> {...} 
static <T> Thing<T> getThing(Class<T> tClass) { 
    if(tClass == Integer.class) 
     return [what?](new ThingForInteger()); 
    ... 
} 

有沒有辦法做到這一點,除了導致警告的演員?

(此外,有沒有一種方法,使一Map<Class<?>, Thing<[class from key]>>,並從它那裏得到實現,而不必抑制警告?)

+0

兩者都是不可能。泛型輸入在運行時被刪除,因此不存在'List .class',例如,只有'List.class'。 – VGR

+0

@VGR我正在尋求一種在編譯時以滿足編譯器的方式提供信息的方式,以免發出警告。這並不一定意味着使用「Thing .class」。 [實際上,編譯器應該足夠聰明,無論如何都不會發出警告,因爲return語句由一個要求類等於類的條件來保護] – Random832

回答

0

AFAIK,這是足有任何警告:

static <T> Thing<T> getThing(Class<T> tClass) { 
    if (tClass == Integer.class) { 
     return (Thing) new ThingForInteger(); 
    } 
    ...