Scala - val parameters



假设我有一个

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方法的字段。

在常规类中,您必须通过valvar指定参数应该具有公共方法。否则初始化后将被丢弃。参见Scala构造函数参数

最新更新