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