- Os arrays são covariantes, o que significa que um array de um subtipo é um subtipo de um array de um supertipo. Já os genéricos são invariantes.
- Os arrays são reificados, ou seja, conhecem e fazem valer o tipo de seus elementos em tempo de execução, enquanto os genéricos são implementados pelo processo de erasure, perdendo as informações sobre os tipos dos elementos em tempo de execução.
- Não é permitida a criação de arrays genéricos devido à falta de segurança de tipos, que poderia resultar em ClassCastException em tempo de execução.
- Tipos como E, List e List são tipos não reificados, enquanto tipos wildcard ilimitados, como List<?> e Map<?,?>, são reificados.
- Recomenda-se utilizar List em vez de arrays quando se trata de type safety e interoperabilidade.
- Arrays e genéricos têm diferentes regras de tipos, o que os torna incompatíveis. Recomenda-se substituir arrays por listas quando se misturam e ocorrem advertências ou erros na compilação.
Reforçando o resumo do resumo:
Segundo o artigo, as vantagens de preferir listas em vez de arrays incluem:
Type Safety: Listas oferecem maior segurança de tipo em tempo de compilação, enquanto arrays podem resultar em erros de tipo em tempo de execução, como ClassCastException.
Interoperabilidade: Listas são mais interoperáveis com código legado e outros tipos genéricos devido ao processo de erasure usado pelos genéricos, enquanto arrays podem ser mais limitados nesse aspecto.
Eliminação de Advertências: O uso de listas em vez de arrays pode eliminar advertências de compilação, especialmente ao lidar com métodos varargs e tipos genéricos.
Confiabilidade: Embora possam ser um pouco mais verbosas e menos eficientes, as listas proporcionam uma maior tranquilidade em relação à segurança de tipo, evitando exceções em tempo de execução.