通常需要快速收集值才能夠對其進行迭代。而不是手動創建實例,添加項目或者執行衆所周知的構造函數初始化,它從數組中創建一個列表(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,...
顯然是無效的語法,但基本上會是什麼樣子什麼要求。
我認爲問題是,有沒有辦法讓編譯器來獲得來自'.class'文字的通用信息。因此,我不認爲有可能在沒有警告的情況下這樣做。 – Keppil