Общепринято, что дженерики Java не работают в некоторых важных аспектах. Комбинация подстановочных знаков и границ привела к некоторому серьезно нечитаемому коду.
Однако, когда я смотрю на другие языки, я действительно не могу найти систему универсальных типов, которой бы довольны программисты.
Если мы возьмем следующее в качестве целей проектирования такой системы типов:
- Всегда создает легко читаемые объявления типов
- Легко учиться (не нужно разбираться с ковариацией, контравариантностью и т. Д.)
- максимизирует количество ошибок во время компиляции
Есть ли язык, который понял это правильно? Если я гуглю, единственное, что я вижу, это жалобы на то, как система типов отстой в языке X. Эта сложность присуща универсальной типизации? Должны ли мы просто отказаться от попыток проверить безопасность типов на 100% во время компиляции?
Мой главный вопрос: какой язык «правильно понял» в отношении этих трех целей? Я понимаю, что это субъективно, но до сих пор я не могу найти ни одного языка, где не все его программисты сходятся во мнении, что система родовых типов - беспорядок.
Приложение: как уже отмечалось, сочетание подтипов / наследования и обобщений - вот что создает сложность, поэтому я действительно ищу язык, который сочетает в себе оба и избегает взрыва сложности.
Foo<T> where SiameseCat:T
), и что нет возможности иметь дженерик, который не может быть преобразован в Object
. ИМХО, .NET выиграл бы от агрегатных типов, которые были бы похожи на структуры, но еще более скромны. Если бы KeyValuePair<TKey,TValue>
был такой тип, то IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
можно было бы привести к нему IEnumerable<KeyValuePair<Animal,Vehicle>>
, но только если тип не может быть помещен в коробку.
easy-to-read type declarations
? Третий критерий также неоднозначен: например, я могу превратить индекс массива из исключений границ в ошибки времени компиляции, не позволяя индексировать массивы, если я не смогу вычислить индекс во время компиляции. Кроме того, второй критерий исключает подтипы. Это не обязательно плохо, но вы должны знать, что вы спрашиваете.