首页 > 解决方案 > 使用变量中的类型调用类型类

问题描述

我有取决于 2 种类型的类型类,其中一种类型包含另一种类型

sealed trait Version
case class Version1() extends Version
case class Version2() extends Version

case class MyModel1(msg: String, version: Version)
case class MyModel2(msg: String, version: Version)

trait Validate[M, V] {
  def run : Boolean
}

object Validators {
  implicit object ValidateModel1 extends Validate[MyModel1, Version1] {
    override def run: Boolean = true
  }
  implicit object ValidateModel2 extends Validate[MyModel1, Version2] {
    override def run: Boolean = true
  }
}

我想这样称呼我的类型类:

object App {

  def main(args: Array[String]): Unit = {
    val model = MyModel1("Test", Version1())
    validate(model)
  }

  def validate(model: MyModel1) {
    import Validators._    

    val v = implicitly[Validate[MyModel1, model.version.type]]
    v.run
  }
}

但这不起作用。

错误:(34, 23) 找不到参数 e 的隐式值:com.playground.Validate[com.playground.MyModel1,model.version.type] val v = implicitly[Validate[MyModel1, model.version.type]]错误:(34, 23) 方法的参数没有足够的隐式:(隐式 e: com.playground.Validate[com.playground.MyModel1,model.version.type])com.playground.Validate[com.playground.MyModel1,model .version.type]。未指定的值参数 e。val v = 隐式[Validate[MyModel1, model.version.type]]

model.version.typeVersion1作品代替

知道如何通过指向类型来调用我的类型类VersionMyModel1

随意提出一个更明确的标题:)

谢谢

标签: scala

解决方案


请记住,隐式是在编译时解析的,因此编译器无法知道内部是否

case class MyModel1(msg: String, version: Version) 

版本是类型Version1Version2。只是不知道。如果您需要使用该信息,则需要将其保存在类的签名中,通过泛型参数抽象类型(您将通过将变成泛型的帮助器类型使用它,因此您可以在签名和表达类型关系)

所以解决方案是像这样生成模型

case class MyModel1[V<:Version](msg:String, version:V)

推荐阅读