これは、暗黙のtypeclassを使用してスカラで解決できます。あなたのタイプごとに具体的な実装と工場出荷時の形質を作成します。
object MyTraitFactory {
def apply[T](param1: Boolean, param2: Boolean)(implicit factory: MyTraitCreator[T]): MyTrait[T] = {
// call the typeclass create method
factory.create(param1, param2)
}
// factory trait
trait MyTraitCreator[T] {
def create(param1: Boolean, param2: Boolean): MyTrait[T]
}
// provide an implicit factory object for the specific types:
object MyTraitCreator {
implicit object MyStringTraitCreator extends MyTraitCreator[String] {
override def create(param1: Boolean, param2: Boolean): MyTrait[String] = {
// create the String type here
new MyStringTrait
}
}
implicit object MyIntTraitCreator extends MyTraitCreator[Int] {
override def create(param1: Boolean, param2: Boolean): MyTrait[Int] = {
// create the Int type here
new MyIntTrait
}
}
}
}
Scalaの暗黙のパラメータを使用して、型クラスを「隠します」。しかし、これが機能するには、暗黙のファクトリオブジェクトをコンパイラがimplicits(例えば、上記のようなコンパニオンオブジェクトMyTraitCreator
)を探す場所に保つ必要があります。パターンはimplicit
がなければ同様に機能しますが、各呼び出しで具体的なファクトリを提供するために呼び出し元が必要です。
このソリューションには多くのボイラープレートコードが含まれていますが、コンパイル時には静的に動作し、タイプ消去されません。それはscalaの構文的な砂糖が付属する:
def apply[T: MyTraitCreator](param1: Boolean, param2: Boolean): MyTrait[T] = {
// call the typeclass create method
implicitly[MyTraitCreator[T]].factory.create(param1, param2)
}