2010-09-22 48 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

相關問題