← Назад к вопросам

Что такое система типов в Java?

1.0 Junior🔥 121 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Система типов в Java

Система типов Java — это фундаментальная часть языка, которая определяет набор правил для объявления и использования типов данных. Она обеспечивает безопасность, контроль и предсказуемость кода.

Основные характеристики

Статическая типизация — типы проверяются на этапе компиляции, а не во время выполнения. Это предотвращает многие ошибки на ранней стадии.

int x = 10;       // Правильно
int y = "hello";  // Ошибка компиляции - несовместимые типы

Сильная типизация — не допускается неявное преобразование между несовместимыми типами.

int num = 42;
String str = num;  // Ошибка компиляции
String str = String.valueOf(num);  // Правильно - явное преобразование

Классификация типов

1. Примитивные типы (Primitive Types)

Числовые типы:

  • byte (8 бит, -128 to 127)
  • short (16 бит, -32768 to 32767)
  • int (32 бита, по умолчанию)
  • long (64 бита, суффикс L)
  • float (32 бита, суффикс F)
  • double (64 бита, по умолчанию для дробных)

Логический тип:

  • boolean (true/false)

Символьный тип:

  • char (16 бит, Unicode)
int a = 10;
long b = 100L;
float c = 3.14f;
double d = 3.14159;
boolean flag = true;
char ch = A;

2. Ссылочные типы (Reference Types)

Классы

String str = "Hello";
ArrayList<Integer> list = new ArrayList<>();

Интерфейсы

List<Integer> list = new ArrayList<>();  // Ссылка на интерфейс

Массивы

int[] arr = {1, 2, 3};
String[] names = new String[5];

Генерики (Generics) — расширение системы типов

Генерики позволяют параметризировать типы для большей гибкости и типобезопасности.

// Без генериков - небезопасно
List list = new ArrayList();
list.add("String");
list.add(123);
int value = (Integer) list.get(0);  // ClassCastException в runtime

// С генериками - безопасно
List<String> strings = new ArrayList<>();
strings.add("String");
strings.add(123);  // Ошибка компиляции
String value = strings.get(0);  // Автоматическое приведение типа

Параметризированные классы

public class Box<T> {
    private T value;
    
    public void setValue(T value) {
        this.value = value;
    }
    
    public T getValue() {
        return value;
    }
}

Box<String> stringBox = new Box<>();
stringBox.setValue("Hello");
String result = stringBox.getValue();

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

Object (базовый класс для всех объектов)
  ├─ String
  ├─ Number
  │  ├─ Integer
  │  ├─ Long
  │  ├─ Double
  │  └─ Float
  ├─ List (интерфейс)
  │  └─ ArrayList (реализация)
  └─ Custom классы

Автоупаковка (Autoboxing) и распаковка (Unboxing)

Java автоматически преобразует примитивные типы в обёрнутые объекты и обратно.

// Autoboxing: int → Integer
Integer num = 10;  // Java преобразует 10 в Integer.valueOf(10)

// Unboxing: Integer → int
int value = num;  // Java преобразует num.intValue()

// В коллекциях
List<Integer> numbers = new ArrayList<>();
numbers.add(42);     // Autoboxing
int first = numbers.get(0);  // Unboxing

// Опасность - NullPointerException
Integer nullable = null;
int result = nullable + 10;  // NullPointerException при unboxing

Полиморфизм и типы

Наследование

class Animal {}
class Dog extends Animal {}

Animal dog = new Dog();  // Dog "is-a" Animal

Интерфейсы

interface Drawable {}
class Circle implements Drawable {}

Drawable circle = new Circle();

Wildcard типы (Wildcards in Generics)

// ? - неизвестный тип
List<?> unknownList = new ArrayList<>();

// ? extends Number - верхняя граница
List<? extends Number> numbers = new ArrayList<Integer>();

// ? super Integer - нижняя граница
List<? super Integer> integers = new ArrayList<Number>();

// Практический пример
public static void printNumbers(List<? extends Number> list) {
    for (Number n : list) {
        System.out.println(n);
    }
}

printNumbers(new ArrayList<Integer>());
printNumbers(new ArrayList<Double>());

Type Erasure (стирание типов)

Генерики работают только на уровне компиляции. В runtime информация о типах стирается.

List<String> strings = new ArrayList<>();
List<Integer> integers = new ArrayList<>();

strings.getClass() == integers.getClass();  // true
// Оба стерли до List

// Нельзя создавать массивы генериков
List<String>[] array = new List<String>[10];  // Ошибка компиляции

Проверка типов и приведение (Cast)

Object obj = "Hello";

// Проверка типа
if (obj instanceof String) {
    String str = (String) obj;
    System.out.println(str);
}

// Pattern matching (Java 16+)
if (obj instanceof String str) {
    System.out.println(str);  // str уже скастован
}

Var (локальный вывод типа, Java 10+)

// Компилятор выводит тип автоматически
var name = "John";      // String
var age = 30;           // int
var list = new ArrayList<String>();  // ArrayList<String>

// Не работает на уровне класса
public var field = "test";  // Ошибка

Лучшие практики

  1. Используй параметризованные типы — List<String> вместо List
  2. Избегай raw types — они небезопасны и deprecated
  3. Используй интерфейсы как типы — List<Integer> вместо ArrayList<Integer>
  4. Выбирай правильный примитивный тип — int вместо long если возможно
  5. Остерегайся NullPointerException при unboxing
  6. Используй var осторожно — только когда тип очевиден

Система типов Java — это мощный инструмент для написания безопасного, масштабируемого и поддерживаемого кода.

Что такое система типов в Java? | PrepBro