Pergunta

gostei da discussão em Diferenças em genéricos, e queria saber se havia algum idioma que usasse esse recurso particularmente bem.

Eu realmente não gosto de Java List<? extends Foo> para List de coisas que são substituíveis por Liskov Foo.Por que não posso List<Foo> cobrir isso?

E honestamente, Comparable<? super Bar>?

Também não consigo me lembrar por que você nunca deve retornar uma matriz de genéricos:

public T[] getAll<T>() { ... }

Nunca gostei de modelos em C++, mas isso acontecia principalmente porque nenhum dos compiladores conseguia emitir uma mensagem de erro remotamente significativa para eles.Uma vez eu realmente fiz um make realclean && make 17 vezes para conseguir algo para compilar;Nunca descobri por que a 17ª vez foi o encanto.

Então, quem realmente gosta usando genéricos em sua linguagem preferida?

Foi útil?

Solução

Haskell implementa muito bem a parametrização do construtor de tipo (genérico ou polimorfismo paramétrico).O Scala também (embora às vezes precise de um pouco de ajuda).

Ambas as línguas têm tipos de tipo superior (também conhecidos comoconstrutores de tipo abstrato, ou polimorfismo de construtor de tipo, ou polimorfismo de ordem superior).

Veja aqui: Genéricos de um tipo superior

Outras dicas

Acho que os genéricos em Java são realmente muito bons.A razão porque List<Foo> é diferente de List<? extends Foo> é que quando Foo é um subtipo de Bar, List<Foo> não é um subtipo de List<Bar>.Se você pudesse tratar um List<Foo> objeto como um List<Bar>, então você pode adicionar Bar objetos, o que pode quebrar coisas.Qualquer sistema de tipo razoável exigirá isso.Java permite que você trate Foo[] como um subtipo de Bar[], mas isso força verificações de tempo de execução, reduzindo o desempenho.Quando você retorna tal array, fica difícil para o compilador saber se deve fazer uma verificação em tempo de execução.

Nunca precisei usar os limites inferiores (List<? super Foo>), mas imagino que possam ser úteis para retornar valores genéricos.Ver covariância e contravariância.

No geral, porém, eu definitivamente concordo com as reclamações sobre sintaxe excessivamente detalhada e mensagens de erro confusas.Idiomas com inferência de tipo como OCaml e Haskell provavelmente tornarão isso mais fácil para você, embora suas mensagens de erro também possam ser confusas.

Caramba, o inglês nem implementa bem os genéricos.:)

Meu preconceito é para C#.Principalmente porque é isso que estou usando atualmente e tenho usado com bons resultados.

Vou adicionar OCaml à lista, que realmente tem genérico genéricos.Concordo que as classes de tipo de Haskell são muito bem feitas, mas é um pouco diferente porque Haskell não tem semântica OO, mas OCaml suporta OO.

Eu uso .Net (VB.Net) e não tive problemas ao usar genéricos.É principalmente indolor.

Dim Cars as List(Of Car)
Dim Car as Car

For Each Car in Cars
...
Next

Nunca tive problemas ao usar as coleções genéricas, embora eu não tenha chegado ao ponto de projetar nenhum objeto que use genéricos por conta própria.

Acho que C# e VB.NET fazem um bom trabalho com genéricos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top