本文目錄一覽:
如何正確理解java中的泛型類型推導
具體類型應該是開發者編寫程序調用的時候自己指定的類型,Java的泛型是一種編譯時泛型,按目前的理解Java泛型只是提供了一種編譯時的類型安全檢查,而編譯後實際運行時是沒有某種被定義的”泛型”類型的(類型搽除)。
其實對於初學者對這一點可以將Java泛型簡單理解為一種將因類型錯誤而引發的異常提前到編碼階段。當開發者在錯誤的調用泛型類和方法時IDE就會提示錯誤,而不用等到程序真正運行時再報錯。
如何理解Java的泛型
泛
型(Generic type 或者 generics)是對
簡單的理解,就是對類型的參數化,比如我們定義一個類屬性或者實例屬性時,往往要指定具體的類型,如Integer、Person等等,
但是如果使用了泛型,我們把這些具體的類型參數化,用一個廣泛的可以表示所有類型的「類型」T來定義,那這個T就是泛型的表示。
可以在集合框架(Collection framework)中看到泛型的動機。例如,Map 類允許您向一個 Map 添加任意類的對象,即使最常見的情況是在給定映射(map)中保存某個特定類型(比如 String)的對象。
因為 Map.get() 被定義為返回 Object,所以一般必須將 Map.get() 的結果強制類型轉換為期望的類型,如下面的代碼所示:
[java] view plain copy print?
Map m = new HashMap();
m.put(“key”, “value”);
String s = (String) m.get(“key”);
要讓程序通過編譯,必須將 get() 的結果強制類型轉換為 String,並且希望結果真的是一個 String。如果map中保存了的不是 String 的數據,則上面的代碼將會拋出 ClassCastException。
java 方法中如何在返回類型使用泛型
主要是一個編譯期的檢查,也避免了我們代碼中的強制轉換,比較經典的用法有泛型DAO,泛型Page的DTO。
現在我要說的是一個挺有趣但是貌似還不是太多的人在代碼中使用的方法,前段時間用guava和op4j的時候發現這樣的用法,看看了源碼,也是很簡單的。
比如guava中創建集合的方法 Listxx list = Lists.newArrayList(),這個代替了我們傳統的 new ArrayListxx,為什麼在=的右邊不需要泛型了呢,我們看看源碼。
[java] view plaincopy
public static E ArrayListE newArrayList() {
return new ArrayListE();
}
返回類型中帶有泛型E,並且這個泛型的來源在 static和 ArrayList之間的位置,我自己的理解是這個就和=左邊的一致,可能說的不夠專業但是意思應該就這樣。
於是我就依樣畫葫蘆在自己的代碼中也用了起來。
我要做的是一個仿httpsession機制的自定義協議是session。在httpsession.getAttribute方法返回的是一個
Object,然後我們再類型轉換。現在我用返回類型泛型來優化這個代碼,以下是我自定義協議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”);
泛型的用法還有很多,有新的心得再補充更新
java 泛型的幾種用法
1. public class DAOT {
/**
* 泛型類
* 聲明類的同時聲明泛型類型
* 1.方法的返回值可以是使用聲明的泛型類型
* 2.方法的參數也可以是聲明類的泛型類型
* 3.方法體內可以使用泛型類型
*/
public T get(Integer id){
return null;
}
public void save(T entity){
}
}
2.
/**
* 泛型方法: 在方法聲明時, 同時聲明泛型. 在方法的返回值, 參數列表以及方法體中都可以使用泛型類型.
* public static T T get(Integer id){
* T result = null;
* return result;
* }
* 把指定類型的數組中的元素放入到指定類型的集合中
*/
java中Dao中用泛型
貼上你IA類的代碼,泛型在java裏面是一種語法糖,作用簡單可以理解為讓開發在編譯階段能發現相關的錯誤 而不是讓錯誤在運行階段才被發現 如ListString 則list裏面只能放入String類型,否則編譯都通不過,你可以搜搜語法糖的作用,實際泛型在形成的class文件中還是會被擦除
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/269971.html