Generics - це спосіб забезпечити повторне використання коду через узагальнення типів. Якщо в вас є компонент системи(клас, функція, інтерфейс…), який працює з одним типом, то Generics дозволяють йому працювати з декількома типами.
Розберемо приклад
Ми розробляємо REST API і хочемо уніфікувати відповіді від бекенду додавши дані в обʼєкт data. Так як в нас багато сутностей, для кожної з них ми будемо дублювати інтерфейси. А якщо ми захочемо змінити error: string на щось інше, наприклад на клас ApiError - це доведеться робити для кожного інтерфейсу окремо.
Якраз цю проблему вирішують Generics. Замість того, щоб дублювати код, ми створюємо один загальний тип і розширюємо його.
Теж саме можна робити з класами, інтерфейсами і функціями. Але для розуміння ідеї і проблеми яку вирішують Generics, цього прикладу буде цілком достатньо.