Scala 是否允许在case类中使用构造函数?

Scala 是否允许在case类中使用构造函数?,scala,traits,case-class,Scala,Traits,Case Class,我有一个case类(我们把它命名为Stuff),我希望能够通过扩展trait(称之为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>

我有一个case类(我们把它命名为
Stuff
),我希望能够通过扩展trait(称之为
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
的情况下,我调用case类的构造函数

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

回答这个问题

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

答案肯定是肯定的。差不多

val b = new Stuff(1)
没有任何问题。现在,
newstuff(1)与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

下面是
Stuff.apply
的实现方式:

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

因此,使用
新东西根本没有坏处

我看到的唯一一个潜在的小问题是模式匹配<上面的code>b与Stuff(uu)不匹配,但是
val c:Stuff=newstuff(1)与Marker
匹配很好。啊,我现在明白了。我认为“
b
以上”指的是我在答复中提到的
b
object Stuff {
  def apply(i: Int): Stuff = new Stuff(i)
}