关于带有多个类型参数的Scala隐式函数的问题



我很难理解与";找不到隐含词的值";错误下面是一个突出错误的最小示例。

sealed trait BehaviourA
final case object A1 extends BehaviourA
final case object A2 extends BehaviourA
sealed trait BehaviourB
final case object B1 extends BehaviourB
final case object B2 extends BehaviourB
trait factory[O<:BehaviourA, R<:BehaviourB]{ ... }
// Define an implicit value for each combination of the two behaviours
object factory {
implicit val behaviour1 = new factory[A1, B1] { ... }
... (one for each Ai, Bj)
}
object genElement {
import factory._
def apply[O <: BehaviourA, R<:BehaviourB](...)(implicit c: factory[O, R])
}

然而,当我尝试从另一个方法调用它时,它抱怨在genExample中找不到隐式c的值。

def callerMtd[T<:BehaviourA](){
genElement[T, B1](...)
}
or 
def callerMtd[T<:BehaviourA, R<:BehaviourB](){
genElement[T, R](...)
}

如果我像下面这样直接给他们打电话,那没关系。为什么我不能在调用方方法中使用类型参数?

def callerMtd(){
genElement[A1, B2](...)
}

即使类型是密封的,并且似乎您提供了所有类型类实例

(每个Ai、Bj一个(

这并没有涵盖中类型边界指定的所有可能情况

def callerMtd[T <: BehaviourA, R <: BehaviourB]

例如,这里有符合界限的类型,但您可能没有为它们提供实例

callerMtd[A1.type with A2.type, B1.type with B2.type]

为了确保编译器能够调用factory[T, R]的实例,其中T <: BehaviourAR <: BehaviourB,您必须指示它如何使用相应的隐式def 生成它

implicit def foo[T <: BehaviourA, R <: BehaviourB]

最新更新