Scala中“案例类扩展特征”是什么意思?

时间:2016-10-21 12:13:25

标签: scala oop inheritance traits case-class

我理解我现有的项目,很少有我无法理解的事情:

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

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

2 个答案:

答案 0 :(得分:4)

一步一步:

  • trait PeriodA { - 特质的定义(大致是一个界面 - 为了进一步理解,请阅读spec

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

  • case class PeriodEntity定义“案例类”,它比一般案例稍微复杂一些。简而言之,该定义使编译器隐式地将val前缀添加到定义的每个所谓的“元素”(字段)中。它还使用apply/unapply函数对定义了伴随对象,如果您想使用模式匹配,它会派上用场,但这超出了当前主题。 Case classes specification

  • start: Long, stop: Long, description: String, manageTo: String - 构造函数参数和类字段的定义,称为“元素”。就编译器隐式标记带有val前缀的元素而言,它们应被视为不可变的。如前所述,它们可以被视为获取访问者。

  • extends PeriodA - 声明类PeriodEntity mixins(implements)PeriodA接口。至于case类元素被编译器隐式地视为val,则无需显式实现或覆盖抽象PeriodA方法 - 编译器会将元素视为默认实现。

答案 1 :(得分:0)

感谢您让我理解,我想分享我的理解,

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

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

我得到了这些误解的解决方案。为此,您应该掌握Java的基本知识。

  1. 将您不理解的代码放入单独的新Scala类中。
  2. 不要编译问题。
  3. 如果需要,重建项目,然后它将在目标中创建.class文件。
  4. 使用任何反编译器jd-GUI或其他。
  5. 或者,cd< ..> \ target \ scala-2.11 \ classes 运行

    javap package.Employee

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

  7. 只有在处理实时项目时才需要1,2步,实际项目代码包含大量逻辑。 如果您觉得可以理解,那么您可以省略1步和2步。

    因此,您可以轻松了解Scala代码的确切含​​义。

    它看起来很大,但不会花费太多时间。让它自己理解,而不是有人解释。