java在1.5版本中增加了泛型,在沒有泛型之前,從集合中讀取每一個對象都需要進行強轉,如果一不小心插入了類型錯誤的對象,在運行時就會報錯,給日常開發帶來了很多不必要的麻煩,比如以下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class testgeneric { public static void main(string[] args) { list list = new arraylist(); list.add( " name:" ); list.add( " zero," ); list.add( " age:" ); list.add( 24 ); list.add( false ); for (object object : list) { string test = (string) object; system.out.print(test); } } } |
1
2
|
name:zero,age:exception in thread "main" java.lang.classcastexception: java.lang.integer cannot be cast to java.lang.string at com.zm.zero.test.testgeneric.main(testgeneric.java: 18 ) |
經過運行,立馬脾氣來了,小樣,來本事啦!
list和list< object>有什么區別,不嚴格的說,前者逃避了泛型檢查,后者告訴編譯器,持有一個object類型的對象,屬于編譯器的一種優化,在編譯的時候不通過來增加類型的安全性。如果上述代碼使用的是泛型,便可以避免這類事故的發生,在java的編程思想中,一直在提倡“出錯之后盡快發現”,那么編譯時發現報錯肯定優先于運行時的報錯,此處做了一個簡單的修改:
此處僅僅是把list改成了list< string>去檢查add時候值的類型,如果add時候值的類型是非法的,編譯時便會報錯。
對于創建泛型對象,幾乎每個開發者都會使用過,比如最初學的class.forname()返回的對象就是class< t>,對于泛型方法,會有部分開發者顯得有點摸不著頭腦,好吧,啥廢話都不說了,就是干,先代碼再上圖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class jsontomodel { /** * * @param msg * @param t * model類 * @return */ public static <t extends basemodel<t>> t getjsontomodel(message msg, class <t> t) { // todo auto-generated method stub try { jsonobject jsonobject = new jsonparser().parse(msg.obj.tostring()) .getasjsonobject().getasjsonobject( "info" ); return gsonhelper.totype(jsonobject.tostring(), t); } catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } return null ; } } |
除了t以外,常見的還有以下幾種:
- e - element (在集合中使用,因為集合中存放的是元素)
- k - key(鍵)
- v - value(值)
- n - number(數值類型)
- ? - 表示不確定的java類型
日常開發中什么時候用到泛型?那就多了,比如解析json的時候,正常情況下,后臺返回的json基本格式都是相同的,但是里面字段各有不同,通過泛型傳入不同的model,大大的提高了代碼的可重用性和可維護性,為了以后的開發省去太多不必要的麻煩。
以上就是java泛型的使用方法總結,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/pangpang123654/article/details/52593269