Загальноприйнято вважати, що дженерики Java не вдалися в деяких важливих способах. Поєднання марок та меж призвело до деякого серйозно нечитабельного коду.
Однак, переглядаючи інші мови, я справді не можу знайти систему загального типу, якою задоволені програмісти.
Якщо взяти за основу цілі дизайну такої системи типу:
- Завжди створює легко читаються декларації типу
- Легкий у навчанні (не потрібно розбиратись на коваріації, протиріччі тощо)
- Максимально збільшує кількість помилок часу компіляції
Чи є якась мова, яка б це зрозуміла? Якщо я google, єдине, що я бачу, - це скарги на те, як система типів висмоктує мову X. Чи такий тип складності притаманний загальній типізації? Чи варто просто відмовитися від спроби перевірити безпеку типу на 100% під час компіляції?
Моє головне питання - яка саме мова "найкраще підійшла" стосовно цих трьох цілей. Я розумію, що це суб'єктивно, але поки що я не можу навіть знайти одну мову, де не всі програмісти згодні з тим, що система загального типу - це безлад.
Додавання: як зазначалося, поєднання підтипу / успадкування та генерики - це те, що створює складність, тому я дійсно шукаю мову, яка поєднує в собі і уникає вибуху складності.
Foo<T> where SiameseCat:T
) і що немає можливості мати загальний тип, до якого не можна конвертувати Object
. IMHO, .NET отримав би перевагу від сукупних типів, схожих на структури, але ще більше голими. Якби KeyValuePair<TKey,TValue>
такий тип був, то на нього IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
можна було б подати IEnumerable<KeyValuePair<Animal,Vehicle>>
, але лише у тому випадку, якщо тип не міг бути полем.
easy-to-read type declarations
? Третій критерій також неоднозначний: наприклад, я можу перетворити індекс масиву поза межами виключень у помилки часу компіляції, не дозволяючи вам індексувати масиви, якщо я не можу обчислити індекс під час компіляції. Також другий критерій виключає підгрупування. Це не обов'язково погано, але ви повинні знати, що ви просите.