Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions _ru/tour/unified-types.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ prerequisite-knowledge: classes, basics

<a href="{{ site.baseurl }}/resources/images/tour/unified-types-diagram.svg"><img style="width:100%" src="{{ site.baseurl }}/resources/images/tour/unified-types-diagram.svg" alt="Scala Type Hierarchy"></a>

## Иерархия типов Scala ##
## Иерархия типов Scala

[`Any`](https://www.scala-lang.org/api/2.12.1/scala/Any.html) это супертип всех типов, также называемый верхним типом. Он определяет несколько универсальных методов, таких как `equals`, `hashCode` и `toString`. У `Any` есть два прямых подкласса: `AnyVal` и `AnyRef`.

Expand All @@ -23,6 +23,9 @@ prerequisite-knowledge: classes, basics

Вот пример, демонстрирующий, что строки, целые числа, символы, логические значения и функции являются объектами, как и любой другой объект:

{% tabs unified-types-1 %}
{% tab 'Scala 2 и 3' for=unified-types-1 %}

```scala mdoc
val list: List[Any] = List(
"a string",
Expand All @@ -35,6 +38,9 @@ val list: List[Any] = List(
list.foreach(element => println(element))
```

{% endtab %}
{% endtabs %}

Объявляем переменную `list` типа `List[Any]`. Список инициализируется элементами различных типов, но все они являются экземпляром `scala.Any`, так что вы можете добавить их в список.

Ниже приведен вывод программы:
Expand All @@ -48,11 +54,15 @@ true
```

## Приведение типа

Числовые типы могут быть приведены следующим образом:
<a href="{{ site.baseurl }}/resources/images/tour/type-casting-diagram.svg"><img style="width:100%" src="{{ site.baseurl }}/resources/images/tour/type-casting-diagram.svg" alt="Scala Type Hierarchy"></a>

Например:

{% tabs unified-types-2 %}
{% tab 'Scala 2 и 3' for=unified-types-2 %}

```scala mdoc
val x: Long = 987654321
val y: Float = x.toFloat // 9.8765434E8 (заметьте, что некоторая точность теряется в этом случае.)
Expand All @@ -61,17 +71,27 @@ val face: Char = '☺'
val number: Int = face // 9786
```

{% endtab %}
{% endtabs %}

Приведение типа - однонаправленно. Следующий пример не скомпилируется:

{% tabs unified-types-3 %}
{% tab 'Scala 2 и 3' for=unified-types-3 %}

```
val x: Long = 987654321
val y: Float = x.toFloat // 9.8765434E8
val z: Long = y // обратно не подходит
```

{% endtab %}
{% endtabs %}

Вы также можете приводить к своему подтипу. Об этом мы поговорим позже в ходе нашего обзора.

## Nothing и Null
`Nothing` является подтипом всех типов, также называемым нижним типом. Нет значения, которое имеет тип `Nothing`. Обычно он используется чтоб дать сигнал о не вычислимости, например брошено исключение, выход из программы, бесконечное зацикливание (т.е. это тип выражения, которое не вычисляется).

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

`Null` подтип всех ссылочных типов (т.е. любой подтип AnyRef). Он имеет одно значение, определяемое ключевым словом литерала `null`. `Null` предоставляется в основном для функциональной совместимости с другими языками JVM и почти никогда не должен использоваться в коде Scala. Об альтернативах `null` мы поговорим позднее.