2014-02-05 59 views
5

通常需要快速收集值才能夠對其進行迭代。而不是手動創建實例,添加項目或者執行衆所周知的構造函數初始化,它從數組中創建一個列表(Set<String> mySet = new HashSet<String>(Arrays.AsList("a", "b", "c"))),我想創建一個函數來爲我完成這項工作。鑽石操作員;初始化經過計數的通用類

除了事實之外,我想提供用於集合類的通用參數<S>,我還希望提供通用參數<T>-實際類型Collection

所以,我的第一種方法是如下:

public static <T extends Collection<S>, S> T initializeCollection(Class<T> concreteClass, S... objects) { 
    T result; 

    try { 
     result = concreteClass.newInstance(); 
     for (S s : objects) { 
      result.add(s); 
     } 

     return result; 
    } catch (InstantiationException e) { 
     return null; 
    } catch (IllegalAccessException e) { 
     return null; 
    } 
} 

這工作得很好,可以像使用:

LinkedList<String> myList = StaticHelper.initializeCollection(LinkedList.class, "a", "b"); 

HashSet<Integer> mySet = StaticHelper.initializeCollection(HashSet.class, 1,2,3,4,5); 

從我測試通過現在這按預期工作。唯一的問題是,驗證程序指出,這是一個無法執行的類型轉換。使用Set的實例,驗證說

Type safety: The expression of type HashSet needs unchecked conversion to conform to HashSet<Integer> 

當我看的返回值越接近IDE是說明我的功能,它看起來是這樣的:

<HashSet, Integer> HashSet my.namespace.helper.CollectionHelper.initializeCollection(Class<HashSet> concreteClass, Integer... objects) 

因此驗證OFC認爲,他必須從HashSet到做一個無效投射。

但在我看來,函數的返回值是T,它幾乎定義爲Collection<S> - 而不是Collection

現在我想知道如果:

  • 沒有與我的功能的問題,真的的取消保存類型轉換髮生
  • 沒有與IDE的問題,沒有顯示正確的returnValue和因此驗證者不能正確地工作。

Sidenode: 即使一個很好的替代已經發布(這我已經在使用),我在解決這個問題很感興趣。

public static <T extends Collection<S>, S> T<S> initializeCollection ... 

或使用

... initializeCollection(HashSet<Integer>.class,... 

顯然是無效的語法,但基本上會是什麼樣子什麼要求。

+0

我認爲問題是,有沒有辦法讓編譯器來獲得來自'.class'文字的通用信息。因此,我不認爲有可能在沒有警告的情況下這樣做。 – Keppil

回答

3

不是一個真正的直接的答案,但你可以把它簡單:

@SafeVarargs 
public static <T extends Collection<S>, S> T initializeCollection(T collection, S... objects) { 
    Collections.addAll(collection, objects); 
    return collection; 
} 

裏調用:

HashSet<Integer> mySet = initializeCollection(new HashSet<>(), 1, 2, 3, 4, 5); 
+0

這也相當不錯。驗證者也喜歡這種方法。 :) – dognose

+0

沒有警告(使用SafeVarargs註釋)。我認爲你的問題是'result = concreteClass.newInstance();'返回一個原始類型,所以我不認爲你可以很容易地擺脫這個警告...... – assylias

+0

沒有這個註釋我沒有任何警告。 – dognose