class PasswordCaseClass(val password:String)
trait PasswordTrait { self:PasswordCaseClass =>
override def password = "blue"
}
val o = new PasswordCaseClass("flowers") with PasswordTrait
是否可以使用PasswordCaseClass
中提供的内容覆盖password
的{{1}}?现在,我收到了这个错误:
PasswordTrait
我希望能够有这样的东西:
e.scala:6: error: overriding value password in class PasswordCase
Class of type String;
method password in trait PasswordTrait of type => java.lang.String needs to be a stable,
immutable value
val o = new PasswordCaseClass("flowers") with PasswordTrait
^
one error found
答案 0 :(得分:24)
您可以使用def
覆盖val
,但不能以相反的方式执行此操作。 val
意味着保证 - 它的值是稳定且不可变的 - def
没有。
答案 1 :(得分:8)
这对我有用(经过一些修改):
trait PasswordLike {
val password: String
}
class PasswordCaseClass(val password:String) extends PasswordLike
trait PasswordTrait extends PasswordLike {
override val password: String = "blue"
}
然后:
scala> val o = new PasswordCaseClass("flowers") with PasswordTrait
o: PasswordCaseClass with PasswordTrait = $anon$1@c2ccac
scala> o.password
res1: String = blue
答案 2 :(得分:4)
您正尝试使用方法定义覆盖该值。它根本没有意义 - 它们有不同的语义。应该每个对象生命周期计算一次的值(并存储在最终的类属性中)和方法可以多次计算。所以你要做的就是以多种方式制定班级合同。
无论如何还有编译器的错误 - 错误说明完全不清楚。