Som*_*ame 2 scala implicit typeclass
考虑以下示例:
sealed trait ST
object ST{
case class ST1() extends ST
case class ST2() extends ST
}
trait TypeClass[A]{
def doSome(a: A): Unit
}
case class Test[T](t: T)
implicit val tp: TypeClass[Test[_ <: ST]] = ??? //the implicit
def foo[A: TypeClass](a: A) = implicitly[TypeClass[A]].doSome(a)
val v: Test[_ <: ST] = ???
foo(v) //error: implicit not found
Run Code Online (Sandbox Code Playgroud)
可以看出,所需的隐式在范围内,而编译器无法识别它。
为什么会发生这种情况,是否有解决方法可以调用foo?
如果你foo(v)改为foo(v)(tp)它会更好地解释(一点点)为什么它不想使用 tp.
简而言之,def foo[A : TypeClass]想要一个隐式类型TypeClass[A]。当你这样做时foo(v), A 变成了Test[_ <: ST]这意味着“Test某些特定但未知的子类型ST”。所以,foo希望有一个隐含的那个特定的类型。
但是,tp是不是。它是一个“TypeClass for Testor any subclass of ST”(_在这两个上下文中显然意味着略有不同的东西,因为它v是一个具体实例,必须具有特定类型)。
长话短说,Test[_ <: ST]是不实际的类型v,而是一个超它的类型。因此,要使其工作,您只需要创建TypeClass逆变器 ( TypeClass[-A]) - 这将使fooaccepttp成为隐式,因为它的类型将是它所期望的子类型。
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |