2016-01-12 17 views
1

鑑於以下階代碼中使用的路徑依賴型:在一個超類簽名

import java.util.NoSuchElementException 
import spray.json.{JsString, JsValue, JsonFormat, deserializationError} 

class EnumJsonFormat[EnumType <: Enumeration](val enum: EnumType) { 
    val format: JsonFormat[enum.Value] = new JsonFormat[enum.Value] { 
    override def write(obj: enum.Value): JsValue = ??? 
    override def read(json: JsValue): enum.Value = ??? 
    } 
} 

class EnumJsFormat[EnumType <: Enumeration](val enum: EnumType) extends JsonFormat[enum.Value] { 
    override def write(obj: enum.Value): JsValue = ??? 
    override def read(json: JsValue): enum.Value = ??? 
} 

第一個版本編譯,並提供枚舉(縮小)串行我需要。第二個失敗,編譯器報告not found: value enum

不幸的是這馬鞍我的不雅需要除了不必要的「外部對象」引用來引用format場(new EnumJsonFormat(MyEnum).format而不僅僅是new EnumJsFormat(MyEnum))。

有沒有辦法在超類簽名或其他任何成語中使用路徑依賴類型來「掩蓋」內部字段?

+0

不知道是什麼原因。你的解決方法似乎是需要的,或者像'特質Foo [A] {def foo(v:A):Unit}; def Bar [EnumType <:Enumeration](enum:EnumType):Foo [enum.Value] = new Foo [enum.Value] {def foo(v:enum.Value)= ??? }' – cchantep

+0

也許相關https://github.com/buildo/ingredients/tree/master/caseenum – Reactormonk

回答

0

原因是,您不能使用依賴類型作爲超類型的類型構造函數參數,您只能將其用作構造函數參數的類型。

您可以解決此通過引入另一種類型的構造函數的參數:

trait JsValue 

trait JsonFormat[A] { 
    def write(obj: A): JsValue 
    def read(json: JsValue): A 
} 

class EnumJsFormat[V,EnumType <: Enumeration](val enum: EnumType {type Value = V}) 
    extends JsonFormat[V] { 

    def write(obj: V): JsValue = ??? 
    def read(json: JsValue): V = ??? 
} 

另外,

EnumJsFormat[V, EnumType <: Enumeration { type Value = V }](val enum: EnumType)