發表文章

目前顯示的是有「Generics」標籤的文章

泛型(generics)與函式界面(functional interface)做為強型別語言的一對翅膀

圖片
今天想來聊點泛型 (generics) 與 函式界面 (functional interface) 在強型別(strong-typed)語言中所扮演的重要角色。 身為Java愛好者、加上從事的工作和語義息息相關,不諱言地對於「強型別」的語言有一種執著。尤其在我們成長的年代,電腦並沒有像今天畫面包裝得美美的視窗防呆界面,對於機器的基底有多「固執」總有一種深刻的體會。若機器只接受整數 123 ,你一不小心給他字串 "123" ,就有可能當場「死」給你看。 而強型別語言的一板一眼有時確實也令人頭痛,就算可以運用多形 (polymorphism) 來增加語義上的彈性,仍然存在不少限制。例如我們可以用下面兩個同名函式來解決上面的問題,同時接受整數和字串: int inc ( int n) { return ++n; } int inc (String n) { return Integer. valueOf (n)+ 1 ; } 不過其實它們也就是兩個機器不會搞混的函式罷了,語義的一致性是給人類看的,機器認的是方法簽章(method signature),兩個函式實際上並沒有什麼關聯性。 當泛型和函式界面先後導入Java之後,強型別的優勢可說突然如虎添翼。為了不讓講古佔太大的篇幅,以下直接來研究一個最近實際遇到的例子。 最近因為武漢肺炎的關係,時常透過寫程式研究一些COVID-19的數據,茲舉以下這個存放某個國家某日數據的value object為例: class COVIDValue { String country; int recovered, cases, critical, active, deaths, todayCases, todayDeaths; double casesPerOneMillion, deathsPerOneMillion; // constructors, getters... } 它包含了三種不同型別( String 、 int 及 double )的資料欄位。假設我們寫了一個函式 list() 用來將存放在 List<COVIDValue> data 集合中的所有資料按某種順序列印出來,至於要依什麼順序,則由傳入的參數 k...