Українська
Підсумки
Висновки
Узагальнення переносять перевірку сумісності типів із виконання до компіляції: контейнер на Object вимагає приведень, а Box<T> зв’язує запис і читання з одним аргументом типу. Параметри типу оголошують у класах, записах і методах; diamond і виведення аргументів скорочують запис, не вимикаючи типізацію. Межі на кшталт <T extends Comparable<? super T>> описують потрібні можливості алгоритму, але не дають гарантій, яких тип насправді не забезпечує. Звичайні generics інваріантні, тоді як масиви коваріантні й перевіряють запис лише під час виконання. Шаблони ? extends і ? super виражають напрям потоку даних за принципом PECS, а захоплення шаблону дозволяє назвати невідомий тип у допоміжному методі. Через стирання типів не можна створити new T() чи new T[], перевантажити методи, що збігаються після стирання, або оголосити узагальнений підклас Throwable. Сирі типи й generic varargs послаблюють перевірки, тому неперевірені операції локалізують і обґрунтовують інваріантом. Типобезпечність не замінює предметної валідації, а контракт узагальненого API перевіряють і тестами, і негативними прикладами компіляції.
Питання для самоперевірки
- Чому контейнер Object потребує приведень?
- Чим параметр типу відрізняється від аргументу?
- Яку область має параметр статичного generic-методу?
- Чому Comparable часто використовує super?
- Чим інваріантність generics відрізняється від масивів?
- Які операції допускають extends і super?
- Коли потрібне захоплення шаблону?
- Що стирається, а що лишається в метаданих?
- Навіщо компілятор генерує bridge-метод?
- Чому внутрішній E[] не можна бездумно повернути клієнту?
- Що саме обіцяє SafeVarargs?
- Як перевірити контракт негативним прикладом компіляції?