型消去の結果同じ引数型になってしまうメソッドをオーバーロードする
学生さんから、「関数リテラルを引数に取るメソッドをオーバーロードするときはどうするのがスマートだと思いますか?」と聞かれて、ちょっと調べてみた。
どういう場合かというと、
みたいな場合。引数一つの関数オブジェクトはFunction1[-T1, +R]トレイトのオブジェクトであり、 型消去の結果、上記の関数は同じ型になってしまうため、このような記述は出来ない。
案としては、個別にクラスでラップしてしまえば型が区別できるので問題を回避できるが、 ラップするとオーバーヘッドがかかってしまうのが難点。 そこで、implicit conversionでコンパイル時に型変換を適用することで、この問題を回避する。
彼がさらに調べた結果、Scalaの言語仕様に関連項目が書いてある(6.26節 p.91)らしく、どうやら この書き方がよいようである、とのことだった。適当に返した返事に、熱心に調べていて素晴らしい。
※続きもどうぞ