我问了以下问题 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
但如果只是有效:
为什么会这样?
答案 0 :(得分:2)
class Test(a: String)
与class Test(var a: String)
相同(如果有的话,它实际上更接近val
声明,但不一样或者,除了案例类别)。后者将a
声明为可变类成员,而前者只是使它成为构造函数的参数,而不是类的成员。出于这个原因,它在您的情况下失败:您必须覆盖a
的抽象成员T1
才能扩展它。
class Test(var a: String)
也不起作用。这是因为a
在T1
中声明为def
,这使其成为不可变的。您可以使用def
或def
覆盖val
,但不能使用可变值覆盖它。如果您需要在Test
中将其变为可变,则必须在var
中将其声明为T1
。