我理解我现有的项目,很少有我无法理解的事情:
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
你能解释一下这里发生了什么吗?
答案 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的基本知识。
或者,cd< ..> \ target \ scala-2.11 \ classes 运行
javap package.Employee
您将在控制台中看到java代码。
只有在处理实时项目时才需要1,2步,实际项目代码包含大量逻辑。 如果您觉得可以理解,那么您可以省略1步和2步。
因此,您可以轻松了解Scala代码的确切含义。
它看起来很大,但不会花费太多时间。让它自己理解,而不是有人解释。