私はタイプクラスを定義する次のコードを持っています。タイプクリティカルとサブタイプ
trait Foo[T] {
def toFoo(x: T): String
}
trait Foos {
def toFoo[T](f: T => String): Foo[T] = new Foo[T] {
def toFoo(x: T): String = f(x)
}
}
object Foo extends Foos {
def toFoo[A: Foo](a: A) = implicitly[Foo[A]].toFoo(a)
implicit def AToFoo: Foo[A] = toFoo { c =>
"A"
}
implicit def BToFoo[T]: Foo[B] = toFoo { c =>
"B"
}
implicit def ListToFoo[T: Foo]: Foo[List[T]] = toFoo { c =>
c.map(toFoo(_)).
}
}
class A
class B extends A
は、今私はtoFoo(List(new A, new B)
をすれば、私が持っている場合、私はList("A", "A")
の代わりList("A", "B")
取得します。タイプB
のクラスに対してAToFoo
ではなくBtoFoo
メソッドが使用されるようにするにはどうすればよいですか?
'List(new A、new B)'にはどんなタイプがありますか? –
'List(A、new B)'の型が 'List [A]' – Stephan
であると期待している場合、 'List [A]'に 'toFoo'をマップすると、'暗黙[Foo [A]] 'を呼び出して、' AToFoo'暗黙のdefを取得し、それを各要素に使用します。型抜きは、型指向のディスパッチのために設計されたものであり、バリューディレクティブのディスパッチではありません。したがって、サブタイプ化で常にうまくいくとは限りません。 –