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())
}