全站文章 iT邦幫忙
iThome Online提供免費電子報,現在就訂,最新IT訊息每日寄達。

iThome 每日新聞報
iThome 產品技術報
加入iThome Online會員,立即使用討論區、Blog等服務。

免費加入會員
登入 / 登出
管理會員帳號
忘記帳號密碼
聯絡客服
訂閱周刊
讀者服務
12' E政府專刊no.6(46)
12' 個資法專刊No2(45)
12' iTcloud No.2(44)
12' e政府專刊No.5(43)
12' 個資法專刊(42)
11' CIO專刊(41)
11' e教育專刊No.3 (40)
11' e政府專刊No.4 (39)
11'iTcloud專刊(38)
10' e教育專刊No.2 (37)
10'e政府專刊No.3 (36)
09'e政府專刊No.2 (35)
09'e教育專刊(34)
09'e政府專刊(33)
08'企業資安專刊-端點安全防護(32)
08'企業採購情報誌(31)
07'資訊安全技術應用專刊(30)
07' 新世代資料中心專刊(29)
07'企業資安技術應用專刊(28)
企業採購情報誌'06冬季號(27)
企業軟體技術應用專刊(25)
企業資安技術應用專刊(24)
多型的本質(二)
文/林信良 2012-08-02
分享到facebook
參數多型用於減輕型態負擔

林信良
因在網路上經營「良葛格學習筆記」(openhome.cc)而聞名,曾任昇陽教育訓練中心技術顧問、甲骨文教育訓練中心授權講師,目前為自由工作者,從事講師、技術書籍寫作與翻譯,專長為Java 程式開發相關技術教育訓練,研究興趣包括:程式語言、Web 相關開放原始碼框架。閒暇之餘記錄所學,技術文件涵蓋 C/C++、Java、Ruby/Rails、Python、JavaScript 等領域。


參數(Parametric)多型允許函式設計時不理會參數實際型態,函式實作版本只有一個,呼叫時則可套用不同類型的引數,由於程式語言上的多型,是可使用一致介面來處理不同資料型態,從這點來看,它才是多型最純粹的型式。

具靜態型別安全檢查功能的泛型函式
有些需求使用函式解決時,並不需要在意傳入的資料型態,設計函式時,可以空泛地定義參數型態,這類函式稱為泛型(Generic)函式。

例如交換陣列兩元素的需求,若使用JDK 1.5以後的版本,可以使用泛型語法設計為 T[] swap(T[] arrs, int i, int j) { T orgi = arrs[i]; arrs[i] = arrs[j]; arrs[j] = orgi; return arrs; },傳入陣列的元素型態都是T型態,但T實際上是型態變數(Type variables),用以取代實際的型態宣告,而泛型語法就是Java中實現參數多型的方式。

參數多型讓函式定義時更具涵蓋性,並具有靜態型別編譯時期安全檢查功能。例如可使用String[] result = swap(original, 1, 2)來呼叫swap函式,傳入物件是String[],傳回物件就會是String[],若使用其他型態宣告result,編譯器就會檢查出這個錯誤。

JDK 1.4前沒有泛型語法,相同需求必須使用次型態多型來達成,也就是定義函式為Object[] swap(Object[] arrs, int i, int j),如果實際上傳入物件是String[],呼叫後傳回物件必須進行轉型,例如String[] result = (String[]) swap(original, 1, 2),轉型語法只是要求編譯器停止該語句的型態檢查,真正的轉型是在執行時期進行,既然編譯時期使用轉型語法要求編譯器不要檢查型態,若執行時期轉型失敗,就得自行負責。

參數多型實際須依賴類型推斷(Type inference),如String[] result = swap(original, 1, 2)時,編譯器可由original推斷出T是String,從而得知傳回物件為String[]。有時為了規範型態變數範圍,可加上約束。例如取陣列中最大值的max函式,可定義為 T max(T[] arrs):

T max = arrs[0];
for(T elem : arrs) if(elem.compareTo(max) > 0) { max = elem; }
return max;

這是由於Java中定義物件可比較性時,必須實現Comparable行為,要求編譯器進一步約束傳入物件須具有Comparable行為,也可以說為了讓編譯器確認每個元素都有compareTo()方法供操作,讓max函式現階段完成編譯。


1 / 2 下一頁

分享到facebook

6/20-6/21 Enterprise Cloud EXPO
企業雲資源應用博覽會與企業雲端論壇
2013 BlackBerry Enterprise Experience Forum-無庸置疑的企業行動化使命
2013 BrainShare Technology Forum Asia Pacific Tour
2013台灣三星 飯店與零售解決方案高峰會
2013 Java Developer Day
更多研討會
▼ ADVERTISEMENT ▼
▲ ADVERTISEMENT ▲

電週文化事業版權所有、轉載必究 •Copyright © iThome | 刊登廣告授權服務服務信箱隱私權聲明與會員使用條款關於iThome