请看下面的代码:
scala> sealed abstract class Person(val name: String)
defined class Person
scala> case class Student(id: Int, name: String) extends Person(name)
<console>:8: error: overriding value name in class Person of type String;
value name needs `override' modifier
case class Student(id: Int, name: String) extends Person(name)
^
这可能是一个微不足道的问题,但在搜索网页很长一段时间后,我无法弄清楚如何简单地传递Student
的构造函数将被提供为{{1}的字符串到name
的构造函数。我不想覆盖任何东西。我做错了什么?
非常感谢你!
答案 0 :(得分:2)
案例类的所有构造函数参数都是val
s。这就是重点。粗略地说,它使您能够享受与常规类相比的类提供的好处:复制,提取,模式匹配等。
如果您希望Student
成为案例类,则应覆盖name
。从理论上讲,你可以通过给val一个不同的名称来避免覆盖它:case class Student(id: Int, studentName: String) extends Person(studentName)
- 这是有效的,但是没有多大意义 - 最终你有两个不同的成员值,它们的值总是相同的。
或者,如果有一个实际的原因,为什么你不想覆盖name
(我无法想象可能是什么,但如果...),那么Student
不应该是案例类:class Student(val id: Int, name: String) extends Person(name)
。