我有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类吗?
随意建议一个更明确的标题:)
谢谢你
请记住,隐式是在编译时解析的,因此编译器无法知道是否在内部
case class MyModel1(msg: String, version: Version)
version的类型是Version1
或Version2
。它只是未知。如果您需要使用该信息,您需要将其保存在类的签名中,可以通过泛型参数或抽象类型(您将通过将变成泛型的辅助类型使用它,因此您可以在签名中使用它并表达类型关系)
因此,解决方案是像这样泛化模型
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的数据类型之