[英]Reference to self type in parameterized trait
I have the following problem: I would like to have an 'instance' (parameterized trait) and 'configuration', and the latter is parameterized by the instance type: 我有以下问题:我想拥有一个“实例”(参数化特征)和“配置”,而后者是由实例类型进行参数化的:
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 = ???
}
So, the issue is that InstanceConfiguration[Instance[Kind2]]
cannot be used as a configuration for Instance[Kind1]
, but now it is too generic, and I'd like compiler to give out error on BInstance.configuration
. 因此,问题在于InstanceConfiguration[Instance[Kind2]]
不能用作Instance[Kind1]
的配置,但是现在它太通用了,我希望编译器在BInstance.configuration
上给出错误BInstance.configuration
。
So how do I change definition of configuration in the Instance trait to reference the concrete InstanceConfiguration of the concrete type? 那么,如何更改实例特征中的配置定义以引用具体类型的具体InstanceConfiguration呢?
You need to use F-Bounded polymophism. 您需要使用F界多态性。 I recommend reading the section in Twitter's Scala School, but in brief, Instance
needs to take the concrete type as a type parameter: 我建议阅读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.