É geralmente aceito que os genéricos Java falharam em alguns aspectos importantes. A combinação de curingas e limites levou a algum código seriamente ilegível.
No entanto, quando olho para outras linguagens, realmente não consigo encontrar um sistema de tipos genéricos com o qual os programadores estejam satisfeitos.
Se considerarmos o seguinte como objetivos de design de um sistema desse tipo:
- Sempre produz declarações do tipo de fácil leitura
- Fácil de aprender (não há necessidade de retocar covariância, contravariância etc.)
- maximiza o número de erros em tempo de compilação
Existe algum idioma que acertou? Se eu pesquisar no Google, a única coisa que vejo são reclamações sobre como o sistema de tipos é péssimo na linguagem X. Esse tipo de complexidade é inerente à digitação genérica? Devemos desistir de tentar verificar a segurança do tipo 100% em tempo de compilação?
Minha principal pergunta é qual é a linguagem que "acertou" a melhor em relação a esses três objetivos. Percebo que isso é subjetivo, mas até agora não consigo nem encontrar uma linguagem em que nem todos os programadores concordem que o sistema de tipos genéricos é uma bagunça.
Adendo: como observado, a combinação de subtipo / herança e genéricos é o que cria a complexidade. Por isso, estou realmente procurando por uma linguagem que combine ambos e evite a explosão da complexidade.
Foo<T> where SiameseCat:T
) e que não há possibilidade de ter um tipo genérico que não seja convertível Object
. IMHO, .NET se beneficiaria de tipos agregados que eram semelhantes a estruturas, mas ainda mais despojados. Se KeyValuePair<TKey,TValue>
fosse desse tipo, um IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
poderia ser convertido para IEnumerable<KeyValuePair<Animal,Vehicle>>
, mas apenas se o tipo não pudesse ser encaixotado.
easy-to-read type declarations
? O terceiro critério também é ambíguo: por exemplo, eu posso transformar exceções de índice fora dos limites em erros de tempo de compilação, não permitindo indexar matrizes, a menos que eu possa calcular o índice em tempo de compilação. Além disso, o segundo critério exclui a subtipagem. Isso não é necessariamente uma coisa ruim, mas você deve estar ciente do que está pedindo.