[英]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.