2010-07-21 4 views
6

В моем собственном коде и в многочисленных почтовых рассылках я заметил замешательство из-за того, что Nothing было выведено как верхняя граница двух других типов.При каких условиях выводится ничего желательного?

Ответ может быть очевидным для вас *, но я ленивый, поэтому я прошу вас *:

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

  • Имеет ли смысл, чтобы компилятор выдавал ошибку в этих случаях или предупреждение, если оно не было отменено какой-либо аннотацией?

* Множественное

ответ

2

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

+0

Правильный ответ на мой неясный вопрос, на данный момент достаточно. :) –

4

Ничто не является подтипом все, так что в каком-то смысле счетчик часть Any, которая является супер-типа все. Ничто не может быть создано, вы никогда не будете держать объект Nothing. Есть две ситуации (я знаю), где нет ничего на самом деле полезно:

  • Функция, которая никогда не возвращается (в отличие от функции, которая не возвращает полезного значение, которое будет использовать блок вместо), который происходит для бесконечных циклов, бесконечной блокировки, всегда бросает исключение или выходит из приложения
  • В качестве способа указать тип пустых контейнеров, например Нил или Нет. В Java у вас не может быть ни одного объекта Nil для универсальных неизменяемых списков без кастинга или других трюков. Если вы хотите создать список дат, даже пустой элемент должен иметь правильный тип, который должен быть подтипом Дата. В качестве даты и, например, Integer не использует общий подтип в Java, вы не можете создать такой экземпляр Nil без трюков, несмотря на то, что ваш Nil даже не имеет значения. Теперь Scala имеет этот общий подтип для всех объектов, поэтому вы можете определить Nil как object Nil extends List[Nothing], и вы можете использовать его для запуска любого списка, который вам нравится.

К вашему второму вопросу: Да, это было бы полезно. Я бы предположил, что уже есть компилятор для включения этих предупреждений, но я не уверен.

+0

Спасибо, но я хорошо осведомлен о том, что ничего не нужно для изоляции; Я пытаюсь понять, когда это полезно для того, чтобы это было выведено алгоритмом LUB. –