Scala-在包含未实现变量的Trait中使用字符串插值
假设我有以下特点Scala-在包含未实现变量的Trait中使用字符串插值,scala,inheritance,traits,Scala,Inheritance,Traits,假设我有以下特点 trait Feature{ val name:String val tableName = s"${name}_table" } 以及一个扩展它的类 class Feature1 extends Feature{ val name = "feature1" } 但是当我初始化类并打印tableName时,我得到的是“null\u table”,而不是“feature1\u table”。我试图完全理解这
trait Feature{
val name:String
val tableName = s"${name}_table"
}
以及一个扩展它的类
class Feature1 extends Feature{
val name = "feature1"
}
但是当我初始化类并打印tableName
时,我得到的是“null\u table”,而不是“feature1\u table”。我试图完全理解这是为什么。这是因为tableName
在Trait中从技术上实现,因此在扩展类实例化它之前,它接受name
的空值吗?“在Trait中从技术上实现,在扩展类实例化它之前,它接受name的空值”是
这是解决办法
trait Feature {
def name: String
final lazy val tableName = s"${name}_table"
}
final class Feature1 extends Feature {
override final val name = "feature1"
}
另一种选择是使用
abstrac类
而不是trait
Scala 3将引入特征参数来正确解决此问题。请注意,
lazy val
是通过同步实现的,这会带来性能损失。如果在高性能多线程环境中操作成本较低,我建议使用def