簡體   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