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