Судя по именам все типы означают одно и тоже.
В каких случаях в scala нужно применять: Nothing, Null, Nil и None, чем они отличаются?
- 1,980
1 Answers
Хорошо расписано тут. Кое-что добавлю, кое-что подрезюмирую.
Тип Nothing - это самый нижний тип. Это значит что переменные с таким типом можно присвоить к абсолютно любому другому типу.
Пример 1:
def isTen(number: Int): Boolean =
if (10 == number) true
else throw new Exception("Number is not ten")
true имеет тип Boolean, кидание исключения имеет тип Nothing и так как Nothing в иерархии типов наследник Boolean, то в результате получается тип Boolean.
Пример 2:
def genericIsTen[T](value: T): T =
if (10 == value) value
else throw new Exception("Generic is not ten")
Так как Nothing самый нижний тип, значит в иерархии типов наследник любого типа - вместо Boolean может быть и дженерик.
Пример 3:
trait Box[+T]
case class Full[T](value: T) extends Box[T]
object Empty extends Box[Nothing]
def boxedIsTen(value: Int): Box[Int] =
if (10 == value) Full(value)
else Empty
Аналогично примерам выше объект с типом Box[Nothing] спокойно присваивается к типу Box[Int] (благодаря ковариантности, т.е. тому плюсику у трейта).
Вывод, как видишь тип Nothing используется тогда, когда нужно чтоб тип был принят другим типом. "Перетёрт" другим типом.
Тип Null - это почти самый нижний тип. В иерархии типов - он наследник всех объектов, но не наследник всех примитивов. А значит он будет работать для объектов точно также как и Nothing.
isTen(null) // НЕ будет работать так как функция хочет примитив
genericIsTen((null) // будет работать
boxedIsTen(null) // НЕ будет работать так как функция хочет Int
Nil - это не тип, это объект
Nil. Тип у этого объекта Nil.type. Объект Nil - один из двух наследников класса List и используется он там, где нужен пустой список типа List. Ну и так как он наследник List-а, у него доступны все его методы.
sealed abstract class List[+A] { /* ... */ }
case object Nil extends List[Nothing] { /* ... */ }
final case class ::[B]( /* ... */ ) extends List[B] { /* ... */}
def listIsTen(number: Int): List[Int] =
if (10 == number) List(number)
else Nil
None - это тоже не тип, а объект
None. Тип у этого объекта None.type. Объект None - один из двух наследников класса Option и используется как пустой вариант Option.
sealed abstract class Option[+A]
case object None extends Option[Nothing] { /* ... */ }
final case class Some[+A](x: A) extends Option[A] { /* ... */ }
def optionIsTen(number: Int): Option[Int] =
if (10 == number) Some(number)
else None
- 1,277
Тип Nothing - это самый нижний тип— то есть он наследуется ото всех и сразу множественным наследованием? Но тогда он должен реализовывать и методы всех объектов. А если это не так, то это не ООП-ное наследование, а просто специальное значение. – Arhadthedev May 21 '17 at 09:21() => throw new Exception()на C#, реализует все возможные методы. – VladD May 21 '17 at 10:55