我正在使用scala 2.10.3并且我有以下测试代码(test.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没有?
我搜索了这个问题的答案 - 看了一些关于元组的事情,试了一下,但它也不适用于我。
答案 0 :(得分:4)
问题:您已经在REPL会话中定义了名称和年龄类,然后加载定义Person的脚本(依赖于v.1类),然后重新定义Name和Age类,所以现在REPL有姓名和年龄v.2,人仍然在考虑v1。繁荣。它们不适合了。解决方案 - 开始一个全新的会议。
此外,要使脚本可编辑,请在Person类之前移动Age和Name类。
关于风格的几点说明:
new
关键字的情况下实例化。