2010-09-22 46 views
2

我有一个case class(我们将其命名为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(),所有工作。我是否错过任何能够标示我在做什么的东西Bad Thing(TM)

scala> a == b 
res0: Boolean = true 

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

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

回答

3

下面是如何Stuff.apply实现:

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

所以没有害处都在使用new Stuff

3

正题

被实例化使用构造犹太

答案当然是肯定的情况下类。类似于

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 
+2

我看到的唯一潜在的小问题是模式匹配。上面的'b'不会匹配Stuff(_),但'val c:Stuff = new Stuff(1)with Marker'会匹配得很好。 – 2010-09-22 20:05:58

+0

它确实匹配,请参阅更新。 – 2010-09-22 20:55:19

+1

我认为@Max的意思是:http://paste.pocoo.org/show/266270/ – missingfaktor 2010-09-23 16:27:25

相关问题