Scala 暗黙の型変換、implicit !?
ScalaにはJavaにはない暗黙の型変換という機能があります。これはScalaに自動的に呼び出させることの出来る、型変換用の関数を定義できる機能です。
関数定義の最初に implicit というキーワードをつけて、この暗黙型変換関数を定義します。この関数は型変換を行う関数なので引数として変換前の型を受け取り、戻り値として変換後の型を返す関数です。
この型変換用の関数は、変換前の型に定義されていない関数の呼び出しを受けた時に変換後の型に定義されている関数を利用するという流れです。
例えばよく使っているStringクラスですが、実はStringクラスもしくはそのクラスの親クラスで定義されていない、sortedメソッドを私たちは特に意識せず使うことができます。下の例ではAclass、Bclassを定義した後、AclassをBclassに変換する関数を定義しています。その後Aclassのインスタンスを作成しAclassには存在しないはずのprintAst関数を実行しています。この時、暗黙の型変換が発生しAclassはBclassとなる、というわけです。二つ目のインスタンスの引数を指定する際にStringクラスインスタンスを持ったso変数で本来存在しないはずの関数、sorted関数を実行しています。これもまた暗黙の型変換の例です。
object Imp extends App{
class Aclass(val data:String){
println(data)
}
class Bclass(val data:String){
def printAst():Unit={
println("**"+data+"**")
}
}
implicit def AtoB(a:Aclass):Bclass={
new Bclass(a.data)
}
val a=new Aclass("Toyotomi")
a.printAst
valso="Toyotomi2"
val b=new Aclass(so.sorted)
b.printAst
}
コンソール
ー>
Toyotomi
**Toyotomi**
2Timoooty
**2Timoooty**