2017-08-05 66 views
-1

我是scala的新手,想要为消息创建模型类.Message由标签组成,并且值和值可以是具有指定长度的字符串,int或一个枚举在traits中定义数据类型的参数以在scala中定义数据类型

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错误,有没有更好的方式来写代码

回答

0

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

尝试这样的事情,但我想你会需要重新定义TagValue类太:

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的'Sizedan example上查看它的用法。

+0

你可以解释一下我对scala有新意的代码吗+ A表示here.The元素也可以是一个枚举。我将如何设置元素的长度 – coder25

+0

长度基本上是约束 – coder25

+0

@ coder25我有用一些解释更新了新的代码。 (说实话,我也不明白你的第一段。) –

相关问题