Scala中的类型模式不考虑继承?

Jes*_*har 9 inheritance scala implicit typeclass

我在某些情况下使用类型类设计API但是我遇到了隐式解析的问题.如下所示,如果存在类型A的隐式对象但是将类型的对象B extends A传递给该方法,则无法找到隐式对象.有没有办法使这项工作或调用者必须将隐式对象放入每个子类的范围?

这是一个例子:

class A
class B extends A

class T[+X]

object T {
  implicit object TA extends T[A]
}

def call[X:T](x:X) = println(x)

// compiles
call(new A)
// doesn't compile
call(new B)

var a = new A
// compiles
call(a)

a = new B
// compiles
call(a)

val b = new B
// doesn't compile
call(b)
Run Code Online (Sandbox Code Playgroud)

无法使用以下输出进行编译:

/private/tmp/tc.scala:16: error: could not find implicit value for evidence parameter of type this.T[this.B]
call(new B)
    ^
/private/tmp/tc.scala:28: error: could not find implicit value for evidence parameter of type this.T[this.B]
call(b)

Itt*_*ayD 7

该调用call(new B)意味着call[B](new B)(tB)tb是T [B]类型或其子类.(期望类型T的参数的方法只能期望T或T的子类,例如,def foo(s: String)不能使用类型的参数调用Any).T [A]不是T [B]的子类型

要解决,你可以改变来定义牛逼T[-X].这意味着编译器会将T [A]视为T [B]的子类型


Tom*_*ett 2

尝试这个:

object T {
  implicit def TA[X <: A] = new T[X]
}

import T._
Run Code Online (Sandbox Code Playgroud)

或者简单地:

implicit def TA[X <: A] = new T[X]
Run Code Online (Sandbox Code Playgroud)