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

Приведение типов в Java включает в себя два основных типа операций: расширение (widening) и сужение (narrowing).

1. **Расширение (Widening)**:

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

   Пример расширения для примитивных типов данных:

   ```java
   int x = 10;
   long y = x; // Расширение типа int до long
   ```

   Пример расширения для объектов:

   ```java
   class Animal {}
   class Dog extends Animal {}

   Dog dog = new Dog();
   Animal animal = dog; // Расширение типа Dog до Animal
   ```
2. **Сужение (Narrowing)**:

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

   Пример сужения для примитивных типов данных:

   ```java
   double a = 10.5;
   int b = (int) a; // Сужение типа double до int
   ```

   Пример сужения для объектов:

   ```java
   class Animal {}
   class Dog extends Animal {}
   class Cat extends Animal {}

   Animal animal = new Dog();
   Dog dog = (Dog) animal; // Явное сужение типа Animal до Dog
   ```

   Важно помнить, что при сужении типов возможна потеря данных или исключения времени выполнения (ClassCastException), поэтому необходимо быть осторожным при использовании сужения. Во избежание ошибок желательно предварительно проверять тип объекта с помощью оператора `instanceof`.
