È comunemente accettato che i generici Java non sono riusciti in alcuni modi importanti. La combinazione di caratteri jolly e limiti ha portato ad alcuni codici seriamente illeggibili.
Tuttavia, quando guardo altre lingue, non riesco davvero a trovare un sistema di tipo generico di cui i programmatori siano contenti.
Se prendiamo quanto segue come obiettivi di progettazione di un tale sistema di tipo:
- Produce sempre dichiarazioni di tipo di facile lettura
- Facile da imparare (non è necessario rispolverare covarianza, contraddizione, ecc.)
- massimizza il numero di errori in fase di compilazione
C'è qualche lingua che l'ha capito bene? Se cerco su Google, l'unica cosa che vedo sono le lamentele su come il sistema dei tipi fa schifo nel linguaggio X. Questo tipo di complessità è inerente alla tipizzazione generica? Dovremmo semplicemente rinunciare a provare a verificare la sicurezza del tipo al 100% in fase di compilazione?
La mia domanda principale è qual è la lingua che "ha fatto bene" il meglio rispetto a questi tre obiettivi. Mi rendo conto che è soggettivo, ma finora non riesco nemmeno a trovare una lingua in cui non tutti i programmatori concordano sul fatto che il sistema di tipo generico sia un disastro.
Addendum: come notato, la combinazione di sottotipo / eredità e generici è ciò che crea la complessità, quindi sto davvero cercando un linguaggio che combini entrambi ed eviti l'esplosione della complessità.
Foo<T> where SiameseCat:T
) e che non c'è possibilità di avere un tipo generico a cui non è convertibile Object
. IMHO, .NET trarrebbe beneficio da tipi aggregati che erano simili alle strutture, ma ancora più disossati. Se KeyValuePair<TKey,TValue>
fosse un tale tipo, allora IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
potrebbe essere lanciato un cast IEnumerable<KeyValuePair<Animal,Vehicle>>
, ma solo se il tipo non potesse essere inscatolato.
easy-to-read type declarations
? Anche il terzo criterio è ambiguo: ad esempio, posso trasformare l'indice di array dalle eccezioni dei limiti in errori di tempo di compilazione non consentendoti di matrici di indici a meno che non sia in grado di calcolare l'indice in fase di compilazione. Inoltre, il secondo criterio esclude il sottotipo. Non è necessariamente una cosa negativa, ma dovresti essere consapevole di ciò che stai chiedendo.