2

我有一个案例类(让我们命名它Stuff),我希望能够通过扩展特征(称为它Marker)在运行时创建匿名子类。这是一个 REPL 会话的片段,它说明了我正在尝试做的事情:

scala> trait Marker
defined trait Marker

scala> case class Stuff(i: Int)
defined class Stuff

scala> val a = Stuff(1)
a: Stuff = Stuff(1)

scala> val b = new Stuff(1) with Marker
b: Stuff with Marker = Stuff(1)

请注意如何a使用 实例化Stuff.apply(),而在b“案例”中,我正在调用案例类的构造函数。

我的问题是:是否使用构造函数来实例化案例类?在我看来确实如此,因为案例类提供的通常便利,例如==.equals().hashCode(),都可以工作。我是否错过了任何会标记我正在做的坏事 (TM)的事情?

scala> a == b
res0: Boolean = true

scala> a.equals(b)
res1: Boolean = true

scala> a.hashCode == b.hashCode
res2: Boolean = true
4

2 回答 2

3

对问题

正在使用构造函数 kosher 实例化案例类

答案是肯定的。就像是

val b = new Stuff(1)

完全没有问题。现在,new Stuff(1) with Marker是不同的,因为创建了一个匿名子类Stuff。不过,我相信这仍然没有问题。我所知道的问题出现在案例类从其他案例类继承时,而您没有这样做。但我可能不知道一些事情。

编辑:刚刚在 REPL 中测试了匹配:

scala> val b = new Stuff(1)
b: Stuff = Stuff(1)

scala> b match {case Stuff(x) => x}
res0: Int = 1

scala> b match {case Stuff(_) => true}
res1: Boolean = true
于 2010-09-22T20:03:50.260 回答
3

下面是如何Stuff.apply实现的:

object Stuff {
  def apply(i: Int): Stuff = new Stuff(i)
}

所以使用new Stuff.

于 2010-09-22T22:16:28.820 回答