Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用case对象满足抽象类型成员_Scala_Case Class_Abstract Type - Fatal编程技术网

Scala 使用case对象满足抽象类型成员

Scala 使用case对象满足抽象类型成员,scala,case-class,abstract-type,Scala,Case Class,Abstract Type,我有一个体系结构,其中我有一个组件的概念,该组件在运行时从静态配置和/或运行时数据动态实例化。数据的静态部分作为定义类型提供,每个组件都必须在其伴生对象中覆盖该类型,并使用configurationReads将其从JSON反序列化 import play.api.libs.json._ trait ComponentDefinition // Intentionally empty trait ComponentCompanion { type Definition <: Comp

我有一个体系结构,其中我有一个
组件的概念,该组件在运行时从静态配置和/或运行时数据动态实例化。数据的静态部分作为
定义
类型提供,每个组件都必须在其伴生对象中覆盖该类型,并使用
configurationReads
将其从JSON反序列化

import play.api.libs.json._

trait ComponentDefinition // Intentionally empty

trait ComponentCompanion {
  type Definition <: ComponentDefinition
  def configurationReads: Reads[Definition]
}
这很有效。在过去,对于没有静态选项的组件,我使用了空的
case类
,但我知道
case对象
更为惯用。不幸的是,它似乎不起作用。如果我尝试:

class OptionlessComponent { /* blah */ }

object OptionlessComponent extends ComponentCompanion {
  case object Definition extends ComponentDefinition
  val configurationReads = Reads.pure(Definition)
}
我得到以下错误:

<console>:19: error: overriding method configurationReads in trait ComponentCompanion of type => play.api.libs.json.Reads[OptionlessComponent.Definition];
 value configurationReads has incompatible type
             val configurationReads = Reads.pure(Definition)
:19:错误:重写类型=>play.api.libs.json.Reads[OptionlessComponent.Definition]的trait ComponentCompanion中的方法configurationReads;
值configurationReads的类型不兼容
val configurationReads=Reads.pure(定义)

有没有类似于
case类
版本的
case对象
的方法来实现这一点?

我认为
case对象
在值命名空间中创建了一个新的
定义
名称,但没有在类型命名空间中重载抽象的
类型定义
。因此,本文汇编:

class OptionlessComponent { /* blah */ }

object OptionlessComponent extends ComponentCompanion {
  case object Definition extends ComponentDefinition
  type Definition = Definition.type
  val configurationReads = Reads.pure(Definition)
}
显然,这并不完全是对空参数
case class
版本的无条件胜利:

class OptionlessComponent { /* blah */ }

object OptionlessComponent extends ComponentCompanion {
  case class Definition() extends ComponentDefinition
  val configurationReads = Reads.pure(Definition())
}
如果我遗漏了一些东西,可以让我将这两种选择的优雅结合起来,我愿意接受建议

class OptionlessComponent { /* blah */ }

object OptionlessComponent extends ComponentCompanion {
  case class Definition() extends ComponentDefinition
  val configurationReads = Reads.pure(Definition())
}