Scala 是否允许在case类中使用构造函数?
我有一个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>
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)
}