scala - 关于 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]
where调用一个实例T <: BehaviourA
,R <: BehaviourB
您必须指示它如何使用相应的隐式 def 生成它
implicit def foo[T <: BehaviourA, R <: BehaviourB]
推荐阅读
- mysql - MySQL查询列值更改的时间戳
- reactjs - 在 react 中使用 react dnd 库上传文件功能
- php - 如何获取用户输入并将其发送到同一文件中的查询?
- c# - 并行分块与顺序分块文件上传
- angular - 无法更新科尔多瓦角度的插件
- javascript - 如何在 VueJS 应用程序中为不同主题实现多个资产路径?
- php - Foreach 循环在 html 输出中创建空表行
- windows - nsExec::ExecToStack 是否正在等待进程完成?(NSIS)
- python - 如何在 PyQt5 中列出内联项目
- c++ - Lennard Jones 势能返回 inf 的动能