scala - 使用变量中的类型调用类型类
问题描述
我有取决于 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.type
用Version1
作品代替
知道如何通过指向类型来调用我的类型类Version
吗MyModel1
?
随意提出一个更明确的标题:)
谢谢
解决方案
请记住,隐式是在编译时解析的,因此编译器无法知道内部是否
case class MyModel1(msg: String, version: Version)
版本是类型Version1
或Version2
。只是不知道。如果您需要使用该信息,则需要将其保存在类的签名中,通过泛型参数或抽象类型(您将通过将变成泛型的帮助器类型使用它,因此您可以在签名和表达类型关系)
所以解决方案是像这样生成模型
case class MyModel1[V<:Version](msg:String, version:V)
推荐阅读
- mysql - 无法识别使用 MAX 和 OVER PARTITION BY 的语法问题
- flutter - Flutter SnackBar 或 Toast 仅在每次 Hot Reload 后显示
- java - Spring @Value with arraylist split 并获得第一个值
- oracle - 计算在 Oracle 中分组的查询中的记录时返回错误
- amazon-s3 - AWS 多区域服务可用性和运营
- c# - 在c#中将字节数组或位图转换为svg
- html - 可访问性:看起来像带有单个面板的选项卡的设计模式
- excel - 公式数据之间的动态范围
- googletest - Googlemock EXPECT_CALL 失败并出现错误:'operator==' 不匹配(操作数类型为 'const XX'
- xamarin - 使用触发器在 Xamarin 表单中的条件下在两个堆栈布局之间进行选择不起作用