繁体   English   中英

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

[英]Reference to self type in parameterized trait

我有以下问题:我想拥有一个“实例”(参数化特征)和“配置”,而后者是由实例类型进行参数化的:

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上给出错误BInstance.configuration

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

您需要使用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 = ???
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM