При каких условиях выводить ничего не желательно? - PullRequest
6 голосов
/ 22 июля 2010

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

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

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

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

* Множественное число

Ответы [ 2 ]

4 голосов
/ 22 июля 2010

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

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

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

2 голосов
/ 22 июля 2010

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

...