我有以下问题:我想要一个"实例"(参数化特征)和"配置",后者由实例类型参数化:
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 = ???
}