I持って、次のクラス: メソッドの戻り値の型の共変
trait Foo {
def update: Foo
}
class ConcreteFoo extends Foo {
override def update: Foo = new ConcreteFoo
}
class FooManager[T <: Foo](val foos: mutable.Map[String, T]) {
def update(id: String): Unit = {
foos.update(id, foos(id).update)
}
}
そしてもちろん
update
関数がコンパイルされていません。
タイプmissmatchはfooが
T
必要見つかりましたdef update: Foo
共変動型にするには?
trait Foo[T <: Foo[T]] { self: T =>
def update: T
}
class ConcreteFoo extends Foo[ConcreteFoo] {
override def update = new ConcreteFoo
}
class FooManager[T <: Foo[T]](val foos: mutable.Map[String, T]) {
def update(id: String): Unit = {
foos.update(id, foos(id).update)
}
}
代替、おそらく単純ルカが言ったように、溶液は、不変Map
を使用することで、:あなたはF-囲まれた多型のような何かをしたいよう
変更可能なマップは、設計上不変です。変更可能なマップを使用しているときは、 'FooManager'を共変することはできません。 –