Разве scala.Unit не совпадает с ()? - PullRequest
0 голосов
/ 23 ноября 2018

Я вижу из иерархии Scala , что AnyVal является супертипом для scala.Unit, Boolean, Char и других Number типов.

scala> val list1 = List((),  1 ) 
list: List[AnyVal] = List((), 1)  // I see this is valid when compared with hierarchy tree.

scala> val list2 = List(Unit,  1 )
list: List[Any] = List(object scala.Unit, 1) // Why???

Я вижу, list1 имеет тип AnyVal, где list2 имеет тип Any, даже если они имеют одинаковые данные (я полагаю).

Разве () не совпадает с Scala.Unit?Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Чтобы ответить на ваш вопрос, () - это значение типа scala.Unit.Принимая во внимание, что scala.Unit является объектом-компаньоном, поэтому он имеет тип Unit.type.

. Посмотрите в приведенном ниже коде REPL:

scala> (): scala.Unit
// (): scala.Unit

scala> scala.Unit
// res1: Unit.type = object scala.Unit

Нижняя строка - это любой передаваемый вами объект.в ковариантный список найдет тип, общий для значений.См. Обсуждение в Почему пример не компилируется, иначе как (со-, противо- и не-) дисперсия работает?

Как вы обнаружили, общий тип Integer и scala.Unit - это AnyVal.Общий тип Intger и Unit.type - Any.

0 голосов
/ 23 ноября 2018

Существует 3 различных объекта:

1) тип scala.Unit

2) объект () - единственный член класса scala.Unit

3) объект scala.Unit - сопутствующий объект 1).Это член класса scala.Unit$ - не то же самое, что scala.Unit.

В вашем первом примере () обозначает 1), во втором Unit обозначает 3)

...