为什么val工作但在这种情况下var不在构造函数中(scala)

时间:2014-12-11 13:31:49

标签: scala

我问了以下问题 if a variable is defined in a class extends a trait, how to use it in the trait?

其中一个答案如下:

trait T1 { def a: String; def x = a.length }
class Test(val a: String) extends T1

但如果只是有效:

  1. 在T1中将a定义为“def a”,如果我使用“val a”或“var a”,则它不起作用
  2. 在测试中将a定义为“val a”,如果我只使用“a”表示默认为“var a”,则它也不起作用。
  3. 为什么会这样?

1 个答案:

答案 0 :(得分:2)

正如我在评论中提到的那样,“#1”应该有效。 关于#2,有两件事:

  1. class Test(a: String) class Test(var a: String)相同(如果有的话,它实际上更接近val声明,但不一样或者,除了案例类别)。后者将a声明为可变类成员,而前者只是使它成为构造函数的参数,而不是类的成员。出于这个原因,它在您的情况下失败:您必须覆盖a的抽象成员T1才能扩展它。

  2. class Test(var a: String)也不起作用。这是因为aT1中声明为def,这使其成为不可变的。您可以使用defdef覆盖val,但不能使用可变值覆盖它。如果您需要在Test中将其变为可变,则必须在var中将其声明为T1