読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

View Bounds

「暗黙」シリーズ3つめ。型パラメータの指定で

[<型パラメータ名> <% <クラス>]
例) [X <% String]

とすることで、「<クラス>に暗黙的に変換可能ななにか」を受け付ける関数が作成できます。

  • 上の例だと、Xは「Stringに変換可能な何か」になります。
    • なので、実行時のコンテキストでStringに変換できない型をXとして指定することはできません。(コンパイルエラーになります)
  • X型を受け取った関数内では、X型の値をStringとして使えます。(このとき、implicit conversionsによる暗黙の型変換が行なわれます。)
// テスト用のクラス
class Kitten(age:Int, name:String) {
    def getAge = age 
    def getName = name
}

object ToString {
  
  // 「Stringに暗黙的に型変換可能な何か」を受けつけ、
  // 変換した値を出力する関数
  def p[X <% String]( x:X ) = {
    val str:String = x
    println( str )
  }
  
}

object ViewBoundsSample {
  def main(args: Array[String]) {
    
    {
        // 型変換用関数。「implicit」をつけておく。
        implicit def kittenToString( k:Kitten ):String = {
            println("convert Kitten to String!")
            k.getName
        }
        
        // このコンテキストでは、KittenはStringに変換可能であるので、
        // Kittenは [X <% String] にマッチする。
        var k:Kitten = new Kitten( 1, "mii" ) 
        ToString.p(k)
    }
    
    {
        // このコンテキストでは暗黙の型変換ができないため、以下はコンパイルエラーとなる。
        //var k:Kitten = new Kitten( 1, "mii" ) 
        //ToString.p(k)
    }
  }
}

実行結果です。

convert Kitten to String!
mii