Case类的apply方法类型

时间:2016-02-14 09:58:47

标签: scala types case-class

我试图使用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获得。

3 个答案:

答案 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功能是您想要的吗?