2017-08-05 43 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我有用一些解釋更新了新的代碼。 (說實話,我也不明白你的第一段。) –

相關問題