ペアリングをカプセル化する暗黙の引数を使用して、タイプセーフでそれを行うこともできます。
class TypeMapping[+A,B] {
def newListB = List.empty[B]
}
trait Logical
object True extends Logical
object False extends Logical
implicit val mapFalseToInt = new TypeMapping[False.type,Int]
implicit val mapTrueToString = new TypeMapping[True.type,String]
def f[A <: Logical,B](switch: A)(implicit tmap: TypeMapping[A,B]) = tmap.newListB
scala> f(True)
res2: List[String] = List()
scala> f(False)
res3: List[Int] = List()
ブール値からカスタムTrue
およびFalse
値に明示的にマップする必要があります。
(List
例として、ターゲット クラスとして選択しました。任意のクラスを選択することも、もう少し作業を加えてジェネリックにすることもできます。)
(編集: oxbow_lakes が指摘しているように、可能なすべての戻り値を同じコード パスで表す必要がある場合、これだけではList[Int]
それList[String]
がList[Any]
できません。 、を使用する必要があります。私の解決策は、またはコンテキストでEither
のみ使用され、そこで型情報を維持できる単一の関数用です。)True
False