What are the differences between final class and sealed class in Scala?

ScalaAccess Modifiers

Scala Problem Overview


There are two types of modifiers in Scala: final and sealed

What are the differences between them? When should you use one over the other?

Scala Solutions


Solution 1 - Scala

A final class cannot be extended, period.

A sealed trait can only be extended in the same source file as it's declared. This is useful for creating ADTs (algebraic data types). An ADT is defined by the sum of its derived types.

E.g.:

  • An Option[A] is defined by Some[A] + None.
  • A List[A] is defined by :: + Nil.

sealed trait Option[+A]

final case class Some[+A] extends Option[A]
object None extends Option[Nothing]

Because Option[A] is sealed, it cannot be extended by other developers - doing so would alter its meaning.

Some[A] is final because it cannot be extended, period.


As an added bonus, if a trait is sealed, the compiler can warn you if your pattern matches are not exhaustive enough because it knows that Option is limited to Some and None.

opt match {
    case Some(a) => "hello"
}

> Warning: match may not be exhaustive. It would fail on the following input: None

Solution 2 - Scala

sealed classes (or traits) can still be inherited in the same source file (where final classes can't be inherited at all).

Use sealed when you want to restrict the number of subclasses of a base class (see "Algebraic Data Type").

As one of the very practical benefits of such a restriction the compiler can now warn you about non-exaustive pattern matches:

sealed trait Duo
case class One(i:Int) extends Duo
case class Two(i:Int, j:Int) extends Duo

def test(d:Duo) {
  match {
    case One(x) => println(x) // warning since you are not matching Two
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1187135View Question on Stackoverflow
Solution 1 - ScaladcastroView Answer on Stackoverflow
Solution 2 - ScalaagschaidView Answer on Stackoverflow