我是 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]
中表示类型将是协变的,因此如果Q
是R
的子类型,则ElementType[Q]
是ElementType[R]
的子类型。(这对于Tag
与任何ElementType
兼容都是必要的(因此它扩展了极端ElementType[Nothing]
(。
我不清楚您的length
用例。如果您希望它成为编译时约束,请查看 Shapeless' Size 及其用法示例。