泛型是(generics)是jdk1.5 的乙個新特性,其實就是乙個語法糖(語法糖往往給程式設計師提供了更實用的編碼方式,有益於更好的編碼風格,更易讀。不過其並沒有給語言新增什麼新東西。),本質上就是編譯器為了提供更好的可讀性而提供的一種小手段,小技巧,虛擬機器層面是不存在所謂泛型的概念的。
那麼我們為什麼使用泛型呢,原因在於:
1.通過泛型的語法定義,約束集合元素的型別,進行安全檢查,把錯誤顯示在編譯期
2.**通用性更強(後面有案例)
3.泛型可以提公升程式**的可讀性,但它只是乙個語法糖,對於jvm執行時的效能是沒有任何影響的。
我們先來看乙個簡單的集合**:
collection c =
newarraylist()
; c.
add(1)
; c.
add(2)
; system.out.
println
(c);
我們在編譯器上會發現它有乙個黃色的警告,但是並沒有報錯我們也可以執行,但是也就在這個時候,張三想要再往集合中輸入幾個數字,來通過測試幾個數字相加來熟悉集合的方法如何使用,於是他加入了3,4,5
collection c =
newarraylist()
; c.
add(1)
; c.
add(2)
; c.
add(3)
; c.
add(4)
; c.
add(
'r')
; c.
add(5)
; system.out.
println
(c);
很顯然1~5之間混入了乙個奇怪的東西但是程式並沒有報錯,畢竟字元也可以作為元素而存在嘛,但是張三很崩潰,他算不出他想要的答案(他學了一天了,眼睛已經幾乎看不到編譯器不報錯的問題),張三強忍著眼疼,看了好幾遍終於流著淚找到了錯誤。他想,要是編譯器會報錯就可以了,於是他看了這篇文章。我們看下面的**:
collection
c =newarraylist()
; c.
add(1)
; c.
add(2)
; c.
add(3)
; c.
add(4)
;'r');
c.add(5)
; system.out.
println
(c);
請允許我把加入字元r的一行注釋掉,畢竟它已經開始報錯了。這就是泛型最基本的一種用法。
我們原來在講多型的時候通過向上轉型的方式,來增加了**的靈活性(不需要知道子類的具體特點就能實現執行結果)。
我們用泛型同樣可以做到甚至做得更好。
public
static
void
print
(e arr)
}public
static
void
main
(string[
] args)
; string[
] names =
newstring
; double[
] moneys =
newdouble
; apicollection.
print
(scores)
; apicollection.
print
(names)
; apicollection.
print
(moneys)
;}
我們將e改為object也是同樣的道理,但是現在用e更符合我們的標題嘛。
泛型只是在編譯期間生存,編譯後就被乾掉了,真正執行時,大多情況下取而代之的是object。也就是上乙個方法的e變成了object…他的存在只是為了方便我們程式設計,如果要對型別擦除做詳細解釋可能要用到反射這個目前還沒有講過,所以我們在這裡僅僅先讓大家感受一下型別擦除:
list
l1 =
newarraylist
(); list
l2 =
newarraylist
(); system.out.
println
(l1.
getclass()
== l2.
getclass()
);
上述的題目答案為true原因是因為string和integer的型別均被型別擦除掉了,我們所能看到的編譯後的父類都是arraylist。 泛型 定義和使用含有泛型的方法
定義和使用含有泛型的方法 泛型定義在方法的修飾符和返回值型別之間 格式 修飾符 返回值型別 方法名 引數列表 使用泛型 含有泛型的方法,在呼叫方法的時候確定泛型的資料型別 傳遞什麼型別的引數,泛型就是什麼型別 例如 public class genericmethod 定義乙個含有泛型的靜態方法 p...
泛型基礎和作用
泛型是jdk5才引進的,泛型其實指得就是引數化型別,使得 可以適應多種型別。像容器,list t 大量使用了泛型,它的主要目的之一就是用來指定容器要持有什麼型別的物件。我認為,泛型的好處很多 當沒有使用泛型的情況下,建立了乙個狗的列表,list dogs new arraylist,每次要往狗列表新...
泛型方法和泛型類的使用(學習筆記)
泛型,即 引數化型別 一提到引數,最熟悉的就是定義方法時有形參,然後呼叫此方法時傳遞實參。那麼引數化型別怎麼理解呢?顧名思義,就是將型別由原來的具體的型別引數化,類似於方法中的變數引數,此時型別也定義成引數形式 可以稱之為型別形參 然後在使用 呼叫時傳入具體的型別 型別實參 為什麼要是用泛型呢?泛型...