Scala - 在包含未实现变量的 Trait 中使用字符串插值

标签 scala inheritance traits

假设我有以下特征

trait Feature{
     val name:String
     val tableName = s"${name}_table"
}

以及一个扩展它的类

class Feature1 extends Feature{
     val name = "feature1"
}

但是当我初始化类并打印tableName时,我得到“null_table”而不是“feature1_table”。我试图完全理解这是为什么。是因为 tableName 在技术上是在 Trait 中实现的,所以它在由扩展类实例化之前需要 name 的 null 值吗?

最佳答案

“技术上是在 Trait 中实现的,它在扩展类实例化名称之前采用空值” 是的。

这是解决方法。

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 将引入特征参数来正确解决此问题。

关于Scala - 在包含未实现变量的 Trait 中使用字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63122870/

相关文章:

c++ - 了解如何解决 C++ 中不明确的成员请求

java - 强制子类使用父类(super class)的@Override 方法。父类(super class)中的方法必须有主体

rust - 为什么 io::copy 要求读者和作者都是可变引用?

c++ - 使用 lambda 访问成员函数内的类模板参数类型失败

java - 在 Elasticsearch Java API 中使用建议

json - 使用 play.api.libs.json 将对象序列化为 json

c++ - const std::shared_ptr<const T> 作为函数的参数最终会改变智能指针中类的值

php - 如何使用 phpunit 模拟非抽象特征方法?

java - 使用 Scala 的 poi-ooxml-schemas-3.9.jar 的 Sbt 编译错误

java - 幕后的 Groovy、Scala 和 Java