2015-08-25 3 views

ответ

62

A final класс нельзя продлить, период.

Характеристика A sealed может быть расширена только в том же исходном файле как указано. Это полезно для создания ADT (алгебраических типов данных). ADT определяется суммой его производных типов.

.: например

  • Option[A] определяется Some[A] + None.
  • A List[A] определяется по :: + Nil.

sealed trait Option[+A] 

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

Поскольку Option[A] запечатана, она не может быть расширен другими разработчиками - сделать это изменило бы его смысл.

Some[A] является окончательным, потому что он не может быть продлен, период.


В качестве дополнительного бонуса, если черта запечатана, компилятор может предупредить вас, если ваш шаблон спички не достаточно исчерпывающими, поскольку он знает что Option является ограниченной в Some и None.

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

Предупреждение: матч не может быть исчерпывающим. Он потерпит неудачу на следующем входе: None

+5

Технически говоря 'шаблоны sealed' может быть продлен в том же модуле компиляции * * , а не тот же файл. Тот факт, что компилятор компилятора Scala равен файлу, является детальностью реализации. Могут быть другие компиляторы, которые используют, например, базу данных для хранения исходных артефактов вместо файловой системы. –

+1

@ JörgWMittag Спасибо за добавление, я не знал об этом различии. – dcastro

4

sealed классов (или черт) по-прежнему могут быть унаследованы в том же исходном файле (где final классы не могут быть унаследованной вообще).

Используйте, чтобы ограничить количество подклассов базового класса (см.

В качестве одного из самых практических преимуществ такого ограничения компилятор теперь может предупредить вас о не-exaustive шаблоне соответствует:

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 
    } 
} 
+1

Технически «запечатанные» шаблоны могут быть расширены в одном компиляторе * *, а не в том же файле. Тот факт, что компилятор компилятора Scala равен файлу, является детальностью реализации. Могут быть другие компиляторы, которые используют, например, базу данных для хранения исходных артефактов вместо файловой системы. –

Смежные вопросы