给出以下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 = ???
}
第一个版本编译,并提供我需要的枚举(de-)序列化器。第二个失败,编译器报告not found: value enum
不幸的是,除了一个不必要的&#34;外部对象&#34;之外,我还不满足于引用format
字段(new EnumJsonFormat(MyEnum).format
而不仅仅是new EnumJsFormat(MyEnum)
)的优雅需求。参考
有没有办法在超类签名中使用路径依赖类型,或者使用任何其他成语来掩盖&#34;内场?
答案 0 :(得分: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)