【发布时间】:2020-08-18 15:08:49
【问题描述】:
我试图了解泛型如何在 Scala 中与继承一起工作。 我有以下代码:
sealed trait Model {}
case class Model1() extends Model
case class Model2() extends Model
trait Repo[A <: Model] {
def doSomething(model: A)
}
class Repo1 extends Repo[Model1] {
override def doSomething(model: Model1): Unit = {
println("Model 1")
}
}
class Repo2 extends Repo[Model2] {
override def doSomething(model: Model2): Unit = {
println("Model 2")
}
}
object Play extends App {
def getModel(i: Int): Model =
i match {
case 1 => Model1()
case 2 => Model2()
case _ => throw new RuntimeException("model not found")
}
val model = getModel(1)
val repo = model match {
case _: Model1 => new Repo1
case _: Model2 => new Repo2
case _ => throw new RuntimeException("something went wrong")
}
repo.doSomething(model)
}
在最后一行repo.doSomething(model) 我得到Type mismatch. Required: _.$1 Found: Model
根据这个答案What is the correct way to implement trait with generics in Scala?,如果我的 repos 类扩展了该类型的特征应该可以工作。
我是 Scala 的新手,我正试图围绕类型系统、泛型、隐式、上限/下限...
什么是_.$1 类型,我怎样才能使它工作?谢谢!
【问题讨论】:
-
请注意,您可以通过丢弃
Play中引用Model2或Repo2的代码来使一切正常,这可能表明该示例被过度最小化了。 -
你说得对,我把事情简化了。其中一些类存在于不同的包中。感谢您的来信!
标签: scala