2016-03-07 2 views
2

Я хотел бы уточнить некоторые данные о Unit и Nothing.Единица vs Nothing in Scala

Например:

def unit(companyId: Int): Unit = {} 

def Nothing(companyId: Int): scala.Nothing = {} 

Согласно документации, Unit в Scala очень похож на void в Java. Но

test("test Unit and Nothing") { 
    println(unit(1)) 
} 
  • Unit возвращение - ()

  • Nothing ничего не вернуть.

Почему Scala имеет переполнения типа Unit, которые возвращают Nothing? Почему Scala не может использовать Nothing вместо Unit?

+1

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

+2

Что вы подразумеваете под «переполнение»? –

+0

Добро пожаловать в StackOverflow! Чтобы показать, как ваши сверстники берут время, чтобы ответить на ваши вопросы, примите их ответы: http://stackoverflow.com/help/someone-answers – manub

ответ

9

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.

+0

Благодарим вас за подробное объяснение. Я знаком с List [Nothing], Nil, Liskov substitution и так далее. Но мой вопрос другой. Почему, если функция не возвращает данные, необходимо использовать Единицу и фактически вернуть() вместо Nothing. –

+0

@scala Возможно, это blogpost http://james-iry.blogspot.ch/2009/08/getting-to-bottom-of-nothing-at-all.html?m=1 может помочь дать вам дополнительную интуицию – godfatherofpolka

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