web-dev-qa-db-ja.com

Scalaのシールドされた抽象クラスと抽象クラス

違いは何ですか sealed abstractおよびabstract Scala class?

67
Łukasz Lew

違いは、封印されたクラスのすべてのサブクラス(抽象かどうかに関係なく)は、封印されたクラスと同じファイルになければならないことです。

81
sepp2k

回答済み と同様に、封印されたクラス(抽象かどうかにかかわらず)のすべての直接継承サブクラスは同じファイル内にある必要があります。これの実際的な結果は、パターンマッチが不完全な場合にコンパイラが警告する可能性があることです。例えば:

sealed abstract class Tree
case class Node(left: Tree, right: Tree) extends Tree
case class Leaf[T](value: T) extends Tree
case object Empty extends Tree

def dps(t: Tree): Unit = t match {
  case Node(left, right) => dps(left); dps(right)
  case Leaf(x) => println("Leaf "+x)
  // case Empty => println("Empty") // Compiler warns here
}

Treesealedの場合、その最後の行がコメント化されていない限り、コンパイラーは警告を出します。

75