Unit
имеет мощность 1. Nothing
имеет мощность 0.
Ваш второй пример
def Nothing(companyId: Int): scala.Nothing = {}
не компилируется. Невозможно вернуть Nothing
, потому что у Nothing
нет жителей. Поэтому функция, возвращающая Nothing
, не может нормально возвращаться; это может вызвать только исключение.
def Nothing(companyId: Int): scala.Nothing = { throw new Exception(); }
в Java Void
сравнима с Unit
в этом Void
также имеет мощность 1; его единственным жителем является null
. Нет типа с мощностью 0 в Java (и не возможно определить такой тип), поэтому Java не имеет типа, сопоставимого с Nothing
. Можно, конечно, написать Java-метод, который всегда выдает исключение, но тип возврата не может выражать это.
Рассмотрите, что происходит, когда вы используете каждый из них в коллекциях. Например, List[Unit]
может содержать любое количество Unit
значений:
List() : List[Unit]
List((),(),()) : List[Unit]
в то время как List[Nothing]
обязательно является пустым, потому что нет ничего, что вы можете поместить в него.
List() : List[Nothing]
Другая важная вещь, чтобы отметить о Nothing
, что это подтип любого другого типа. Это имеет смысл, потому что у него нет жителей; поэтому каждое предложение (propositions are closely related to types) около Nothing
экземпляров держится пусто.В качестве примера того, почему это полезно, снова рассмотреть списки:
List.empty[Nothing] : List[String]
Здесь мы приписываем List[Nothing]
к типу List[String]
, который мы можем сделать, так как параметр типа List
«s ковариантен и Nothing
является подтипом String
. Обратите внимание, что мы не смогли сделать это с помощью List[Unit]
, так как Unit
является не подтип String
.
Возможный дубликат [Использование Null/Nothing/Unit в Scala] (http://stackoverflow.com/questions/16173477/usages-of-null-nothing-unit-in-scala) –
Что вы подразумеваете под «переполнение»? –
Добро пожаловать в StackOverflow! Чтобы показать, как ваши сверстники берут время, чтобы ответить на ваши вопросы, примите их ответы: http://stackoverflow.com/help/someone-answers – manub