Українська
Сирі типи та стандартні контракти
Сирі типи та забруднення купи
Сирий тип List замість List<String> залишений для сумісності зі старим кодом. Він вимикає частину перевірок і створює unchecked-попередження. Використання raw-посилання для запису числа в список рядків може дати помилку значно пізніше, коли інший код прочитає елемент як String.

Рис. 9.6. Попередження про сирий тип вказує на втрату контракту.
Компілюйте приклади з javac -Xlint:unchecked. Попередження не потрібно прибирати широким @SuppressWarnings на весь клас лише для чистого журналу. Якщо неперевірена операція необхідна, обмежте приглушення найменшою ділянкою й запишіть інваріант, який гарантує правильність.
Generic varargs поєднує масив і тип зі стертими аргументами. Анотація @SafeVarargs є обіцянкою автора, що метод не порушує безпеку цього масиву й не передає його небезпечному коду. Вона не додає runtime-перевірки. Її дозволено лише для визначених мовою методів і конструкторів, зокрема static, final або private методів; не застосовуйте її без доказу.
Узагальнені результати та стандартні контракти
Optional<T> виражає наявне або відсутнє не-null значення. Він не замінює контейнер помилки з поясненням і не повинен сам дорівнювати null. У наступній темі функціонального API розглянемо його перетворення та запасні значення.
Sealed-інтерфейс може мати параметр результату й два записи для успіху та відмови. Java не виводить коваріантність Result<Subtype> автоматично; вибір параметрів і шаблонів залишається частиною API. record і sealed доповнюють generics, але не змінюють основні правила інваріантності.
Comparable<T> задає природний порядок, Comparator<T> – зовнішнє правило, а Iterable<T> – спосіб отримати ітератор. Ці контракти зустрічатимуться в колекціях і Stream API. Важливо читати не лише назву методу, а й напрямки extends і super у його параметрах.
Перевірка узагальненого API має дві складові. Виконувані тести перевіряють порядок, порожній стан, межі й незмінність після відмови. Окремі негативні файли компіляції перевіряють, що небезпечне присвоєння або запис відхиляються до запуску. Такий файл не включають у звичайну успішну збірку.