直接ではありません。 Scalaでこれを行う通常の方法はtypeclassです。
trait FAble[T] { def doF: String }
object FAble {
implicit val fInt = new FAble[Int] { def doF = "I'm an int" }
implicit val fFloat = new FAble[Float] { def doF = "I'm a float" }
implicit val fBurger = new FAble[Burger] { def doF = "You want fries?" }
}
def f[T](implicit ev: FAble[T]) = ev.doF
// or
def f[T: FAble] = implicitly[FAble[T]].doF
それは公平なビットより冗長だが、それはあまりにもいくつかの利点を持っている - 暗黙のインスタンスは(implicit def
の代わりにval
Sを使用して)計算することができ、かつ任意のタイプのために複数のインスタンスがありますこれを使用すると、コードの異なるポイントで異なるインスタンスをスコープ内に持つことで、ビヘイビアを選択できます。
C++の方法ではできない理由は、Scalaのジェネリックスでは、異なるタイプパラメータ(@specialized
を除いて、どちらも必要ないので)のコード生成が含まれていないということです。だから、 "一般的なテンプレートのコードを生成する代わりに、この位置でIntを見ると、コンパイラは、この特定のコードを代わりに使用する"と言っても意味がありません。