繁体   English   中英

定义scala函数时编译错误

[英]compile error when defining scala function

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

我搜索了该问题的答案-看到了一些有关元组的信息,尝试了一下,但对我也不起作用。

问题:您已经在REPL会话中定义了名称和年龄类,然后加载了定义Person的脚本(基于v.1类),然后重新定义了名称和年龄类,因此REPL现在具有名称和年龄v.2,人仍然根据v1进行思考。 繁荣。 他们不适合了。 解决方案-开始一个全新的会话。

此外,要使脚本可编译,请将Age和Name类移至Person类之前。

关于样式的几个注意事项:

  1. 没有必要对名称和年龄进行密封,如果要禁止继承,请将它们定为最终形式
  2. 类型别名在那里可能会做得更好
  3. 案例类应实例化而无需new关键字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM