问题描述
我是 Scala 的新手,想为消息创建一个模型类.消息由标记作为键和值组成,值可以是具有指定长度、整数或枚举的字符串
I am new to scala and want to create a model class for a message .Message are comprisedoing of tag as key with value and value can be a string with specified length,int or a enumeration
tag value
100 a
200 b constraint of length =45
300 0,1,2
其中 0-新1 次修正2-取消
where 0-new 1-amend 2- cancel
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 中遇到编译错误,有没有更好的方法来编写代码
I am getting compile error in MessageId,is there a better way to write the code
推荐答案
我猜你的 MessageId
问题是它引用了 Tag[Int]
和 Value[String]
,没有泛型参数.
I guess your problem with MessageId
that it refers to a Tag[Int]
and Value[String]
, which have no generic parameters.
尝试这样的事情,但我认为您也需要重新定义 Tag
和 Value
类:
Try something like this, though I think you will need to redefine the Tag
and Value
classes too:
case class MessageId(tag: Tag{type A = Int}, value: Value{type A = String}){
override def toString = tag + "=" + value + 1.toChar
}
因为您似乎想将它们用作泛型,所以我会尝试这样的操作:
As you seem to want to use them as generics, I would try something like this:
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
}
+
in [+A]
表示类型是协变的,所以如果 Q
是 R
的子类型code>, ElementType[Q]
是 ElementType[R]
的子类型.(这是Tag
与任何ElementType
兼容所必需的(因此它扩展了极端的ElementType[Nothing]
).)
+
in [+A]
means the type will be covariant, so if Q
is a subtype of R
, ElementType[Q]
is a subtype of ElementType[R]
. (This is necessary for Tag
to be compatible with any ElementType
(so it extends the extreme ElementType[Nothing]
).)
您的 length
用例我不清楚.如果您希望它成为编译时约束,请查看 Shapeless' 大小 和 使用示例.
Your use case for length
is not clear for me. If you want it to be a compiletime constraint, take alook at Shapeless' Sized and an example on its usage.
这篇关于特征中的类型参数以在 Scala 中定义数据类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!