当前位置: 首页 > 知识库问答 >
问题:

使用变量中的类型调用类型类

唐康安
2023-03-14

我有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.Valides[com.playground.MyModel1,model.version.type]val v=隐式[Valides[MyModel1,model.version.type]]错误:(34,23)没有足够的隐式方法参数:(隐式e:com.playground.Valides[com.playground.MyModel1,model.version.type])com.playground.Valides[com.playground.MyModel1,model.version.type]。未指定的值参数e. val v=隐式[验证[MyModel1,model.version.type]]

更换<代码>模型。版本使用版本1键入

你知道如何通过指向MyModel1中的Version类型来调用我的type类吗?

随意建议一个更明确的标题:)

谢谢你

共有1个答案

吴刚毅
2023-03-14

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

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

version的类型是Version1Version2。它只是未知。如果您需要使用该信息,您需要将其保存在类的签名中,可以通过泛型参数或抽象类型(您将通过将变成泛型的辅助类型使用它,因此您可以在签名中使用它并表达类型关系)

因此,解决方案是像这样泛化模型

case class MyModel1[V<:Version](msg:String, version:V)
 类似资料:
  • 问题内容: 除了Swift,我还有这个问题。如何Type在泛型中使用变量? 我尝试了这个: This didn’t work either: 有没有办法做到这一点?我感觉到Swift只是不支持 它,并且给了我一些模棱两可的错误消息。 编辑:这是一个更复杂的示例,其中无法 使用通用函数标头来解决问题。当然,这没有任何意义, 但是我在代码中的某处合理地使用了这种功能 ,宁愿发布一个干净的示例而不是我的

  • 有没有任何方法来实现我所需要的,“值”字段的变量类型值?

  • 怎么确定一个变量是什么类型的呢?大家可以用 type() 函数来检查。Lua 支持的类型有以下几种: Nil 空值 所有没有使用过的变量,都是 nil。nil 既是值,又是类型。 Boolean 布尔值 true 或 false Number 数值 在 Lua 里,数值相当于 C 语言的 double String 字符串 如果你愿意的话,字符串是可以包含 '\0' 字符的 Table 关系表类型

  • 变量只不过是我们的程序可以操作的存储区域的名称。 Pascal中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局; 可存储在该内存中的值范围; 以及可以应用于变量的操作集。 变量的名称可以由字母,数字和下划线字符组成。 它必须以字母或下划线开头。 Pascal not case-sensitive ,因此大写和小写字母在这里意味着相同。 根据前一章中解释的基本类型,将有以下基本变量类型

  • 变量只是用于存储值的保留内存位置。 这意味着当您创建变量时,您在内存中保留了一些空间。 根据变量的数据类型,解释器分配内存并决定可以存储在保留内存中的内容。 因此,通过为变量分配不同的数据类型,可以在这些变量中存储整数,小数或字符。 将值分配给变量 Python变量不需要显式声明来保留内存空间。 为变量赋值时,声明会自动发生。 等号(=)用于为变量赋值。 =运算符左边的操作数是变量的名称,=运算符

  • 变量为我们提供了程序可以操作的命名存储。 Java中的每个变量都有一个特定的类型,它决定了变量内存的大小和布局; 可存储在该内存中的值范围; 以及可以应用于变量的操作集。 必须先声明所有变量才能使用它们。 以下是变量声明的基本形式 - data type variable [ = value][, variable [ = value] ...] ; 这里data type是Java的数据类型之