在参数化特征中引用自我类型



我有以下问题:我想要一个"实例"(参数化特征)和"配置",后者由实例类型参数化:

trait Kind
trait Kind1 extends Kind
trait Kind2 extends Kind
trait Instance[T <: Kind] {
  def configuration: InstanceConfiguration[Instance[_]]
}
trait InstanceConfiguration[+T <: Instance[_]] {
}
class AInstance extends Instance[Kind1] {
  override def configuration: AConfiguration = ???
}
class AConfiguration extends InstanceConfiguration[AInstance] {
}
class BInstance extends Instance[Kind1] {
  override def configuration: AConfiguration = ???
}

所以,问题是InstanceConfiguration[Instance[Kind2]]不能用作Instance[Kind1]的配置,但现在它太通用了,我希望编译器在BInstance.configuration上给出错误。

那么,如何更改实例特征中配置的定义以引用具体类型的具体实例配置呢?

你需要使用 F 有界的多形。我建议阅读Twitter的Scala School中的部分,但简而言之,Instance需要将具体类型作为类型参数:

trait Kind
trait Kind1 extends Kind
trait Kind2 extends Kind
trait Instance[A <: Instance[A, T], T <: Kind] {
  self: A =>
  def configuration: InstanceConfiguration[A]
}
trait InstanceConfiguration[+T <: Instance[_, _]] {
}
class AInstance extends Instance[AInstance, Kind1] {
  override def configuration: AConfiguration = ???
}
class AConfiguration extends InstanceConfiguration[AInstance] {
}
class BInstance extends Instance[BInstance, Kind1] {
  override def configuration: AConfiguration = ???
}

最新更新