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