3 回答

TA貢獻1853條經驗 獲得超6個贊
參考這段List克隆代碼。返回的List<T>中T為入參的Class<T>
public static <S, T> List<T> copyList(List<S> source,Class<T> targetClass) {
if (CollectionUtils.isEmpty(source)) {
return new ArrayList<T>();
}
String json = JSON.toJSONString(source);
List<T> list = JSON.parseArray(json, targetClass);
return list;
}

TA貢獻1844條經驗 獲得超8個贊
主要是一個編譯期的檢查,也避免了我們代碼中的強制轉換,比較經典的用法有泛型DAO,泛型Page的DTO。
現在我要說的是一個挺有趣但是貌似還不是太多的人在代碼中使用的方法,前段時間用guava和op4j的時候發現這樣的用法,看看了源碼,也是很簡單的。
比如guava中創建集合的方法 List<xx> list = Lists.newArrayList(),這個代替了我們傳統的 new ArrayList<xx>,為什么在=的右邊不需要泛型了呢,我們看看源碼。
[java] view plaincopy
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
返回類型中帶有泛型E,并且這個泛型的來源在 static和 ArrayList之間的位置,我自己的理解是這個就和=左邊的一致,可能說的不夠專業但是意思應該就這樣。
于是我就依樣畫葫蘆在自己的代碼中也用了起來。
我要做的是一個仿httpsession機制的自定義協議是session。在httpsession.getAttribute方法返回的是一個
Object,然后我們再類型轉換?,F在我用返回類型泛型來優化這個代碼,以下是我自定義協議session的getAttribute的代碼。
[java] view plaincopy
@SuppressWarnings("unchecked")
public <E> E getAttribute(String key) {
return (E) map.get(key);
}
調用代碼
[java] view plaincopy
Boolean isFirst = session.getAttribute("first");
在httpsession中我們則要這么寫
[java] view plaincopy
Boolean isFirst = (Boolean)session.getAttribute("first");
泛型的用法還有很多,有新的心得再補充更新
添加回答
舉報