定义scala函数时编译错误

时间:2014-01-09 13:09:58

标签: scala

我正在使用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没有?

我搜索了这个问题的答案 - 看了一些关于元组的事情,试了一下,但它也不适用于我。

1 个答案:

答案 0 :(得分:4)

问题:您已经在REPL会话中定义了名称和年龄类,然后加载定义Person的脚本(依赖于v.1类),然后重新定义Name和Age类,所以现在REPL有姓名和年龄v.2,人仍然在考虑v1。繁荣。它们不适合了。解决方案 - 开始一个全新的会议。

此外,要使脚本可编辑,请在Person类之前移动Age和Name类。

关于风格的几点说明:

  1. 没有必要将姓名和年龄密封,如果你想禁止继承,那就让他们成为最终的
  2. 类型别名可能会在那里做得更好
  3. 案例类应该在没有new关键字的情况下实例化。