"case class extends trait" 在 Scala 中是什么意思?

What does "case class extends trait" mean in Scala?

我正在理解我现有的项目,有几件事我无法理解:

trait PeriodA {
  def start: Long
  def stop: Long
  def description: String
  def manageTo: String
}

case class PeriodEntity(
  start: Long,
  stop: Long,
  description: String,
  manageTo: String)
  extends PeriodA

你能解释一下这里发生了什么吗?

一步一步:

  • trait PeriodA { – trait 的定义(大致是一个接口——进一步理解请阅读spec

  • def start: Long def stop: Long def description: String def manageTo: String – 'on-call' 评估特征的属性的定义。您可以将它们视为 Java getFieldName 函数。

  • case class PeriodEntity 定义一个 'case class' 比一般定义稍微复杂一点。简而言之,该定义使编译器隐式地将 val 前缀添加到定义的每个所谓的 'element' (字段)。它还使用 apply/unapply 函数对定义伴随对象,如果您想使用模式匹配,它会派上用场,但这不在当前主题范围内。 Case classes specification

  • start: Long, stop: Long, description: String, manageTo: String – 构造函数参数和 class 字段的定义,称为 'elements'。至于编译器隐式标记带有 val 前缀的元素,它们应该被认为是不可变的。正如前面提到的,它们可以被视为获取访问器。

  • extends PeriodA - 声明 class PeriodEntity mixins(实现)PeriodA 接口。就 case class 元素被编译器隐式认为是 val 而言,无需显式实现或覆盖抽象 PeriodA 方法——编译器会将元素视为您的默认实现。

谢谢你让我明白了,我喜欢分享我的理解,

trait PreridA - 只不过是一个有 4 个 get 方法的接口。

case class PeriodEntity extends PeriodA -- PeriodEntity 应该有 4 个 get 方法,如 PeriodA 中所述。如果您删除 PeriodEntity 中的任何文件,那么您将获得编译异常。简单来说,它就像一个class实现了一个接口。

我找到了解决此类误解的方法。为此,您应该具备 Java.

的基本知识
  1. 把你看不懂的代码放到单独的new Scala中class.
  2. 让它没有编译问题。
  3. 如果需要,重建项目,然后它将在目标中创建 .class 个文件。
  4. 使用任何反编译器 jd-GUI 或其他。
  5. 或者,cd <..>\target\scala-2.11\classes 运行

    javap package.Employee

  6. 您将在控制台中看到 java 代码。

只有在处理实时项目时才需要 1,2 步,实际项目代码包含很多逻辑。 如果你觉得你能理解那么你可以省略1和2步骤。

这样,您就可以轻松理解您的 Scala 代码的确切含​​义了。

看起来是个大程序,但用不了多少时间。让它自己理解而不是别人解释。