scala> ////////////////////////////////////////////////////////////////
scala> // Sealed Class & Pattern Matching #323
scala> // Helps to make sure that we have covered all the
scala> // possible Patterns in our code. If not convered,
scala> // the compiler provides a warning
scala> // A Sealed Class can only have Subclass in the same
scala> // file
scala> ////////////////////////////////////////////////////////////////
scala> sealed abstract class Subject
defined class Subject
scala> case class Math(mark: Int) extends Subject
defined class Math
scala> case class History(mark:Int) extends Subject
defined class History
scala> case class Science(mark:Int) extends Subject
defined class Science
scala> case class Geography(mark:Int) extends Subject
defined class Geography
scala> case class TwoSubject(s1: Subject, s2: Subject) extends Subject
defined class TwoSubject
scala>
scala> // Whern a Sealed class is used for Pattern matching
scala> // ... and if all the Patterns are not covered
scala> // we get a compiler warning
scala> def checkSealed(sub: Subject) = sub match {
| case a: Math => println("This is math")
| }
:26: warning: match may not be exhaustive.
It would fail on the following inputs: Geography(_), History(_), Math(_), Science(_), TwoSubject(_, _)
def checkSealed(sub: Subject) = sub match {
^
checkSealed: (sub: Subject)Unit
scala>
scala> // Compiler warning can be also taken away using
scala> // the annotation @unchecked
scala> def checkSealed(sub: Subject) = (sub: @unchecked) match {
| case a: Math => println("This is math")
| }
checkSealed: (sub: Subject)Unit