Українська
Підсумки
Висновки
Параметр типу робить тип значення частиною контракту класу чи функції, і компілятор перевіряє цей контракт без приведень. Верхні межі, зокрема T : Comparable<T> і кілька меж у where, описують потрібні алгоритму можливості, а не конкретні класи. За замовчуванням параметр може бути nullable, тому зміст null визначають до вибору межі T : Any або T & Any. Звичайний узагальнений клас інваріантний: підтип елемента не робить контейнер підтипом, якщо через нього можна записувати. Позначки out і in на місці оголошення та проєкції на місці використання відкривають лише безпечний напрям доступу, а Box<*> позначає невідомий, але узгоджений аргумент. Через стирання типів на JVM перевірка is T можлива лише для reified-параметра inline-функції, і вона не перевіряє вмісту вкладених узагальнень. Sealed-результати з Nothing виражають успіх і помилку, тоді як typealias лише дає інше ім’я тому самому типу. Контракт узагальненого API перевіряють і виконуваними прикладами, і окремими прикладами, які не повинні компілюватися.
Питання для самоперевірки
- Чим параметр типу відрізняється від аргументу типу?
- Яка верхня межа використовується за замовчуванням?
- Коли
T : Anyкраще за nullable-параметр? - Що означає
T & Any? - Чому контейнер із читанням і записом інваріантний?
- У якому напрямку можна присвоїти
Source<Cat>? - Чому споживач тварин придатний для котів?
- Чим проєкція відрізняється від оголошеної варіантності?
- Чому
Box<*>не дорівнюєBox<Any?>? - Які перевірки не дозволяє стирання типів?
- Чого reified не гарантує для вкладених колекцій?
- Чому псевдонім не створює новий предметний тип?