2016-03-07 3 views
2

Согласно спецификации scala, scala.Nothing type - buttom для всех типов. Тип «Nothing» существует, но экземпляр Nothing не существует.Понимание scala.Nothing type

Как это работает:

def ??? : Nothing = throw new NoImplementedError 
def sys.error(message: String): Nothing = throw new RuntimeException() 
def sys.exit(status: Int): Nothing = {...} 

Но на самом деле, все упомянутые методы возвращают исключение. Исключено def sys.exit Не могли бы вы прояснить больше о типе Nothing. Любые примеры, объяснения.

Спасибо!

+0

Возможный дубликат [Использование Null/Nothing/Unit в Scala] (http://stackoverflow.com/questions/16173477/usages-of-null-nothing-unit-in-scala) – Mohitt

+0

Метод, который _returned_ an исключение будет выглядеть как 'def foo = new RuntimeException'. Если вы дали ему подпись типа ': Nothing', он не будет компилироваться, потому что он что-то возвращает. –

ответ

1

В Scala абсолютно все нуждается в обратном типе.

println например, имеют тип возврата Unit, потому что это единица вычислений, которая не возвращает значение.

Если все должно иметь тип возвращаемого значения, то, как бы реализовать такую ​​функцию ???, так что он может быть использован любой функции, независимо от того, какой тип он не должен возвращаться?

Ну вот что Nothing для, это подтип каждых других типов (как Any это верхний типа любого другого типа), так что функция, которая возвращает Nothing можно использовать в любом месте, и система типа всегда будет оставаться последовательной ,

Как вы уже заметили, функции, возвращаемые Nothing, никогда не возвращают значение. Это связано с тем, что для Nothing нет значения.
Вы можете видеть это как способ сделать компилятор «счастливым» для функций, которые только бросают или останавливают приложение или цикл навсегда.


В случае, если вы удивляетесь, почему мы не используем Unit вместо Nothing, вот пример:

def notYetImplemented: Unit = throw new Exception() 
def myFunc: String = notYetImplemented 

Это не будет компилироваться, так как Unit не String или подтип String. Так что вам нужно будет сделать:

def myFunc: String = { 
    notYetImplemented 
    null 
} 

Что не очень удобно и для нас, чтобы написать значение, чтобы вернуться даже преподается мы никогда не достигнем этого кода.

Приветствия

+0

Да, но на самом деле выкинуть новое исключение RuntimeException() вместо Nothing, правильно? –

+0

Бросание! = Возвращение. – Ryan

+0

@scala тип 'Nothing' является гарантией того, что он никогда ничего не вернет. Таким образом, другие опции бросают исключение или завершают приложение или циклически завершаются навсегда. – Joan

2
def ??? : Nothing = throw new NoImplementedError 

не возвращает исключение, он вызывает исключение, которое не то же самое. Исключения представляют собой механизм потока управления, который заставляет управление немедленно перейти к ближайшему установленному обработчику в стеке вызовов. Это означает, что в

val x = ??? 

x никогда не будет присвоено значение, так x может иметь любой тип вообще. Этот тип - Nothing в системе типа scala, которая является подтипом всех типов.

Непрерывность также имеет тип ничего, поскольку он также никогда не возвращает значение, например.

def loop(): Nothing = loop() 

val x: Int = loop() 

поэтому недопустим, поскольку x никогда не будет назначен.