scala的語法很多,有些人認為過於繁瑣,有些人卻認為正是因為繁瑣,所以才讓這門語言嚴謹和強大。
例如在翻閱scala資料或者檢視scala原始碼的時候,經常會看到「<:>:」,這是什麼鬼?下面我就來**一下這兩個符號的用法:
我們定義乙個類:「earth」
class earth
}
我們定義了乙個子類:「animal」
class animal extends earth }
然後 ,還有animal 的乙個子類 「bird」
class bird extends animal }
最後,又定義了乙個函式:
def biophony[t <: animal seq things map>
乍一看:這tm是什麼鬼?「<:>
其實, 這屬於scala泛型中的知識:上邊界和下邊界。上邊界是「<:>:」;t <: animal>
知道了是什麼之後,接著呼叫就很簡單了:
biophony(seq(new bird, new bird))
這樣一來就輸出:
bird sounds
bird sounds
完美!假如因為可以包含animal所以,這麼呼叫也可以:
biophony(seq(new animal, new animal))
輸出:
animal sound
animal sound
甚至可以乙個animal,乙個bird,多型嘛!
biophony(seq(new animal, new bird))
輸出:
animal sound
bird sounds
但是,這樣就不可以了:
biophony(seq(new earth, new earth))
輸出:
報錯!scala的定義了乙個「界限」來規定泛型可以適用的在繼承關係中的範圍,「<:>
我們把「<:>:」
def biophony[t >: animal](things: seq[t]) = things map (_.sound())
不對這怎麼還報紅了呢?細細想來,animal的父類的話,不能確定能不能有sound()方法呀,因為父類太多了,object還是呢。報錯也正常,我們就直接返回 things吧
def biophony[t >: animal](things: seq[t]) = things
好了,這下好了,不報紅了,我們傳乙個animal的父類「earth」的佇列,然後沒個元素呼叫「sound()」方法
biophony(seq(new earth, new earth)).map(_.sound())
輸出:
hello !
hello !
之前的結論,呼叫animal也應該是可以的:
biophony(seq(new animal, new animal)).map(_.sound())
輸出:
animal sound
animal sound
好的,也是正確的。假如我們傳animal子類bird看看會不會報錯
biophony(seq(new bird, new bird)).map(_.sound())
輸出:
bird sounds
bird sounds
居然不報錯!還執行了!這是怎麼回事??
我們看一下傳bird後的返回值是什麼:
是animal !真相大白了,由於bird是子類,scala把bird當做animal來處理了。也就是說,「>:」的時候,傳任何引數都可以,但是返回值回有所不同,animal的子類都會統一按照animal來處理!
那我們傳乙個和animal毫不相關的類,會出現什麼情況呢?
class moon
寫了乙個moon,然後按照如下文傳參呼叫
biophony(seq(new moon, new moon))
不報錯!
我們看一下返回值:
object!scala把它看做了object。也就是說,可以隨便傳!只不過和animal直系的,是animal父類的還是父類處理,是animal子類的按照animal處理,和animal無關的,一律按照object處理!
scala 符號的使用
一 匿名函式,左邊是引數 右邊是函式實現體 val list list 1,2,3 map println list 二 函式型別的宣告,左邊是引數型別,右邊是方法返回值型別 val g int string myint val h unit 三 指定引數為call by name by name ...
shell中各種奇怪的符號整理
子shell中執行 數值比較,運算,支援正則 i 1 i 3 i commond1 commond2 命令替換 commond 支援運算 1 2 集合,可將命令與字串隔開 變數的引用 檔案測試,數值比較,檔案比較,字串比較 a 且,o 或 增加了對正則的支援,包含,或,且 支援變數運算 2 2 2 ...
那些年我看到的奇怪sql
基礎表 日誌表 臨時表 物件表 流水表 歷史記錄表 create table 顧客待裁決 顧客編號 int 11 unsigned not null auto increment,許可 varchar 20 default null,顧客姓名 varchar 30 default comment 姓...