我试图使用type
字段,但似乎我做错了。它似乎与经典类一起使用,但由于某种原因,案例类apply
的类型不匹配。
object Common {
type EntityId = Long
}
import Common._
abstract class IdStore {
self =>
type Entity
type Ref <: IdRef[_]
type Self <: IdStore {type Entity = self.Entity; type Ref = self.Ref}
def apply(data: Map[Ref, Entity]): Self
def data: Map[Ref, Entity]
def merge(other: Self): Self = apply(data ++ other.data)
}
trait IdRef[T] {
def id: T
}
trait EntityIdRef extends IdRef[EntityId] {}
class TestStore(val data: Map[IdRef[Int], Object]) extends IdStore {
override type Entity = Object
override type Ref = IdRef[Int]
override type Self = TestStore
override def apply(data: Map[Ref, Entity]): Self = new TestStore(data)
}
case class TestCaseClassStore(data: Map[IdRef[Int], Object]) extends IdStore {
override type Entity = Object
override type Ref = IdRef[Int]
override type Self = TestCaseClassStore
}
Main.scala:34: error: class TestCaseClassStore needs to be abstract, since method apply in class IdStore of type (data: Map[TestCaseClassStore.this.Ref,TestCaseClassStore.this.Entity])TestCaseClassStore.this.Self is not defined
case class TestCaseClassStore(data: Map[IdRef[Int], Object]) extends IdStore {
^
one error found
代码也可在Ideone获得。
答案 0 :(得分:2)
错误消息的内容以及我认为发生了什么,是您对所有类型的IdStore进行了覆盖,但是并没有为&#34; apply& #34;方法
你已经适应了&#34; TestStore&#34; class,但不在&#34; TestCaseClassStore&#34;。
答案 1 :(得分:2)
这仅仅是因为case class
不的apply()
方法。它的伴随对象会获得apply
方法,但不会获得类。
要为您的问题提供解决方案,我们需要了解IdStore
及其子类的预期用法的更多内容。假设IdStore
是完美的,您可能不希望TestCaseClassStore
首先成为case class
。
答案 2 :(得分:1)
我怀疑你有一个关于案例类错误的细节:
案例类没有免费申请功能!
它们带有一个伴侣对象,它具有工厂apply
功能,可以创建案例类的新实例。那就是:
case class Foo(bar: Int)
类似于
class Foo(val bar: Int)
object Foo {
def apply(bar: Int): Foo = new Foo(bar)
}
所以,在你的代码中
case class TestCaseClassStore(data: Map[IdRef[Int], Object]) extends IdStore {
override type Entity = Object
override type Ref = IdRef[Int]
override type Self = TestCaseClassStore
}
缺少apply
中所需的IdStore
功能。
考虑到这一点,您确定apply
中定义的IdStore
功能是您想要的吗?