2016-01-12 3 views
1

Учитывая следующий код SCALA:Использование зависимого типа пути в суперкласса подписи

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

Не уверен, что причина. Ваш способ обхода кажется необходимым, или что-то вроде 'trait 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) 
Смежные вопросы