簡體   English   中英

存在類型的Scala蛋糕模式:編譯錯誤

[英]Scala cake pattern with Existential Types: compile error

通過這個問題,我發現這個文章從Precog的“配置”模式。 我嘗試了兩個模塊:

case class Pet(val name: String)

trait ConfigComponent {
  type Config

  def config: Config
}

trait Vet {
  def vaccinate(pet: Pet) = {
    println("Vaccinate:" + pet)
  }
}


trait AnotherModule extends ConfigComponent {
  type Config <: AnotherConfig

  def getLastName(): String

  trait AnotherConfig {
    val lastName: String
  }

}

trait AnotherModuleImpl extends AnotherModule {
  override def getLastName(): String = config.lastName

  trait AnotherConfig {
    val lastName: String
  }

}

trait PetStoreModule extends ConfigComponent {
  type Config <: PetStoreConfig

  def sell(pet: Pet): Unit

  trait PetStoreConfig {
    val vet: Vet
    val name: String
  }

}

trait PetStoreModuleImpl extends PetStoreModule {
  override def sell(pet: Pet) {
    println(config.name)
    config.vet.vaccinate(pet)
    // do some other stuff
  }
}

class MyApp extends PetStoreModuleImpl with AnotherModuleImpl {

  type Config = PetStoreConfig with AnotherConfig

  override object config extends PetStoreConfig with AnotherConfig {
    val vet = new Vet {}
    val name = "MyPetStore"
    val lastName = "MyLastName"
  }

  sell(new Pet("Fido"))
}


object Main {
  def main(args: Array[String]) {
    new MyApp
  }
}

但是,我得到這個編譯錯誤:

覆蓋特征Other中的Config類型,其界限<:MyApp.this.AnotherConfig;
類型配置具有不兼容的類型
Config = PetStoreConfig和AnotherConfig類型

我不清楚為什么這不起作用(Precog在示例中還使用了兩個組件),有什么想法嗎?

您定義了AnotherConfig兩次-一次在AnotherModule中,再一次在AnotherModuleImpl中。 性狀的這兩個定義是不同的,並且被認為是不兼容的。 Config類型是根據前者定義的,但是在定義MyApp時,會將類型設置為后者-因此會出現錯誤。

您可以通過刪除后者的AnotherConfig定義(由@rarry建議)或通過使后者的特征擴展前者的特性(如果您出於某種原因保留后者,例如定義額外的字段)來解決此問題。

從AnotherModuleImpl中刪除AnotherConfig的定義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM