Я только что прочитал: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
Насколько я понимаю, Null
это трейт и единственный его экземпляр null
.
Когда метод принимает аргумент Null, мы можем передать ему только Null
ссылку или null
напрямую, но не любую другую ссылку, даже если она имеет значение NULL ( nullString: String = null
например).
Мне просто интересно, в каких случаях использование этой Null
черты может быть полезно. Также есть черта Nothing, для которой я больше не вижу примеров.
Я тоже не понимаю, в чем разница между использованием Nothing и Unit в качестве возвращаемого типа, поскольку оба не возвращают никакого результата, как узнать, какой из них использовать, например, у меня есть метод, который выполняет ведение журнала?
Есть ли у вас использование Unit / Null / Nothing как чего-то другого, кроме возвращаемого типа?
Статья, которую вы цитируете, может ввести в заблуждение.
Null
Типа для совместимости с виртуальной машиной Java и Java , в частности.Мы должны учитывать, что Scala :
null
ссылки для доступа, например, к библиотекам и коду Javaтаким образом, возникает необходимость определить тип для
null
значения, которое являетсяNull
признаком и имеетnull
его единственный экземпляр.В
Null
типе нет ничего особенно полезного, если только вы не являетесь системой типов или не разрабатываете компилятор. В частности, я не вижу разумной причины для определенияNull
параметра типа для метода, поскольку вы не можете передать ничего, кромеnull
источник
Unit
можно использовать так:Это позволяет вам передать произвольный блок кода для выполнения.
Null
может использоваться как нижний тип для любого значения, допускающего значение NULL. Пример такой:Nothing
используется в определенииNone
Это позволяет вам назначать a
None
любому типу,Option
потому что всеNothing
«расширяет».источник
если вы используете
Nothing
, делать нечего (включая консоль печати), если вы что-то делаете, используйте тип выводаUnit
... тогда как пользоваться
Nothing
?источник
E
inOption
должен быть в ковариантном положении:trait Option[+E]
чтобы разрешить такие вещи, какval x: Option[Int] = None
Я никогда не использовал этот
Null
тип, но вы его используете тамUnit
, где вы бы использовали javavoid
.Nothing
- это особый тип, потому что, как уже упоминал Натан, не может быть экземпляраNothing
.Nothing
это так называемый нижний тип, что означает, что это подтип любого другого типа. Это (и параметр контравариантного типа) - вот почему вы можете добавить любое значение кNil
- а это -List[Nothing]
- и тогда список будет иметь этот тип элементов.None
также если типаOption[Nothing]
. Каждая попытка получить доступ к значениям внутри такого контейнера вызовет исключение, потому что это единственный допустимый способ возврата из метода типаNothing
.источник
IO[Unit]
для печати на консоли и т.п.Часто ничего не используется неявно. В приведенном ниже коде, другой пункт имеет тип Ничего , что подкласс Boolean (равно как и любой другой AnyVal). Таким образом, все присвоение действительно для компилятора, хотя предложение else на самом деле ничего не возвращает.
val b: Boolean =
if (1 > 2) false
else throw new RuntimeException("error")
источник
Вот пример
Nothing
изscala.predef
:Если вы не знакомы (и поисковые системы не могут искать по нему),
???
это функция-заполнитель Scala для всего, что еще не было реализовано. Прямо как у КотлинаTODO
.Вы можете использовать тот же трюк при создании фиктивных объектов: переопределите неиспользуемые методы пользовательским
notUsed
методом. Преимущество неиспользования в???
том, что вы не получите предупреждений о компиляции вещей, которые никогда не собираетесь реализовывать.источник
С точки зрения теории категорий « Ничто» является исходным объектом, а Единица - конечным объектом .
https://en.wikipedia.org/wiki/Initial_and_terminal_objects
Начальные объекты также называются котерминальными или универсальными , а конечные объекты также называются конечными .
Если объект одновременно является начальным и конечным , он называется нулевым объектом или нулевым объектом.
источник