2014-01-09 114 views
0

當我使用Scala的2.10.3和我有以下的測試代碼(test.scala)不工作:編譯錯誤定義的Scala功能

case class Person (name: Name, age: Age) 
sealed class Name (val value: String) 
sealed class Age (val value: Int) 
def foo (n: Name, a: Age): Person = new Person (n, a) 

case class PersonBasic (name: String, age: Int) 
def fooBasic (n: String, a: Int): PersonBasic = new PersonBasic (n, a) 

當我運行scalac,我得到:

scala> :load test.scala 
Loading test.scala... 
defined class Person 
defined class Name 
defined class Age 
<console>:31: error: type mismatch; 
found : Name(in object $iw)(in object $iw)(in object $iw)(in object $iw) 
required: Name(in object $iw)(in object $iw)(in object $iw)(in object $iw) 
def foo (n: Name, a: Age): Person = new Person (n, a) 
               ^
<console>:31: error: type mismatch; 
found : Age(in object $iw)(in object $iw)(in object $iw)(in object $iw) 
required: Age(in object $iw)(in object $iw)(in object $iw)(in object $iw) 
    def foo (n: Name, a: Age): Person = new Person (n, a) 
                ^
defined class PersonBasic 
fooBasic: (n: String, a: Int)PersonBasic 

問題:爲什麼fooBasic編譯時沒有問題,但是foo沒有?

我搜索了這個問題的答案 - 看到關於元組的東西,試過了,但它對我也不起作用。

回答

4

問題:你已經定義了類名和年齡浮動在你的REPL會話,然後你加載腳本定義人(依靠v.1類),然後你重新定義名稱和年齡類,所以現在REPL有Name and Age v.2,Person仍然認爲是v1。繁榮。他們不適合了。解決方案 - 開始全新的會話。

此外,爲了使腳本可編譯,請在Person類之前移動Age和Name類。

款式有兩點要注意:

  1. 沒有做出名字和年齡密封點,讓他們最終如果要禁止繼承
  2. 類型別名可能會做得更好有
  3. 案例類應該被實例化,沒有new關鍵字。
+0

thx om-nom-nom。移動名稱和年齡定義上面Person的def解決了我的問題。事實上,它解決了我更大的問題,出現相同的症狀。 Thx的提示以及! – sak