恐るべし・・・

何かと出遅れた感タプシなのだけど、ちょっと触ってみてる。

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}

コンパイルエラーが出力される。実行せずともプギャー!!という訳。
関数型言語だ」と言う事はかくも強力なのか…。


参考: