在超类签名中使用路径依赖类型

时间:2016-01-12 08:06:05

标签: scala types

给出以下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;内场?

1 个答案:

答案 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)