恐るべし・・・
何かと出遅れた感タプシなのだけど、ちょっと触ってみてる。
package aaa object Flyers { class Bird(val name: String) { def fly(height : int) { Console.println("I'm Fly") } } class Plane(val callsign: String) { def fly(height : int) = { println("We're Fly") } } def takeoff(runaway :int,r:{val callsign:String;def fly(height:int)}) { println("CALLSIGN : " + r.callsign) r.fly(runaway) } def main(args: Array[String]) { val bird = new Bird("Raven"){val callsign = name} takeoff(12,bird) val plane = new Plane("AT-2148") takeoff(32,plane) } }
断じてDuckタイピングではない。例えば、
new Bird("Raven"){val callsign = name}
の、後半部分を削除して
new Bird("Raven")
とすれば、
type mismatch; found : aaa.Flyers.Bird required: AnyRef{def callsign: String; def fly(int): Unit}
とコンパイルエラーが出力される。実行せずともプギャー!!という訳。
「関数型言語だ」と言う事はかくも強力なのか…。
参考: