假设我有一个
object Error{
abstract class Reason{def p:P}
case class A(p:P) extends Reason
case class B(p:P) extends Reason
...
}
现在我想添加一个特例B:
object Error{
abstract class Reason{def p:P}
case class A(p:P) extends Reason
class B(val p:P) extends Reason{
def apply(p:P) = new B(p)
def unappply(b:B) =
if(b == null) None
else Some(b.p)
}
case class SpecialB(override val p:P) extends B(p)
...
}
在这个变化中,为什么我必须在B中将参数p声明为val,而当B是case类时,为什么我不必这样做?
case类构造函数的所有参数都公开为公共值,对于普通类则不是这样,普通类必须使用val
使参数公开。
在case类中,当您提供构造函数参数p
时,将创建一个具有与def p:P
相同签名的公共getter方法的字段。
在常规类中,您必须通过val
或var
指定参数应该具有公共方法。否则初始化后将被丢弃。参见Scala构造函数参数