特征中的类型参数,用于在 Scala 中定义数据类型



我是 scala 的新手,想为消息创建一个模型类。消息包括将标签作为具有值的键,值可以是具有指定长度的字符串,int或枚举

tag     value
100      a    
200      b      constraint of length =45
300      0,1,2

其中 0-新 1-修正 2-取消

trait ElementType  {
type A
type length
}

case class Tag() extends ElementType {
override type A = this.type
}
case class Value() extends ElementType{
override type A = this.type
override type length = this.type
}
case class Message(
messageId:MessageId
)
case class MessageId(tag: Tag[Int], value: Value[String]){
override def toString = tag + "=" + value + 1.toChar
}

我在 MessageId 中遇到编译错误,有没有更好的方法来编写代码

我想你的问题MessageId它指的是没有通用参数的Tag[Int]Value[String]

尝试这样的事情,尽管我认为您还需要重新定义Tag类和Value类:

case class MessageId(tag: Tag{type A = Int}, value: Value{type A = String}){
override def toString = tag + "=" + value + 1.toChar
}

由于您似乎想将它们用作泛型,我会尝试这样的事情:

sealed trait ElementType[+A] {
def length: Int
}
sealed trait Tag extends ElementType[Int] {
override def length: Int = 0
}
case object Tag100 extends Tag
case object Tag200 extends Tag
case object Tag300 extends Tag
sealed trait Value[+A] extends ElementType[A] {
override def length: Int = 0
}
final case class Value100(a: String) extends Value[String] {
override def length: Int = a.length
}
final case class Value200(b: String) extends Value[String] {
require(b.length <= length)
override def length: Int = 45
}
case object Value300One extends Value[Nothing]
case object Value300Two extends Value[Nothing]
case object Value300Three extends Value[Nothing]
case class Message(
messageId:MessageId
)
case class MessageId(tag: Tag, value: Value[String]){
override def toString = tag + "=" + value + 1.toChar
}

+[+A]中表示类型将是协变的,因此如果QR的子类型,则ElementType[Q]ElementType[R]的子类型。(这对于Tag与任何ElementType兼容都是必要的(因此它扩展了极端ElementType[Nothing](。

我不清楚您的length用例。如果您希望它成为编译时约束,请查看 Shapeless' Size 及其用法示例。

最新更新