我有一个案例类(让它命名为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
的情况下,我正在调用case类的构造函数。
我的问题是:是使用构造函数kosher实例化案例类吗?在我看来,因为案例类提供了常见的便利,例如==
,{{ 1}}和.equals()
都可以。我是否遗漏了任何会影响我正在做什么 Bad Thing(TM)的东西?
.hashCode()
答案 0 :(得分: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
答案 1 :(得分:3)
以下是Stuff.apply
的实施方式:
object Stuff {
def apply(i: Int): Stuff = new Stuff(i)
}
因此使用new Stuff
时没有任何伤害。