Pregunta

Me gustó la discusión en Diferencias en genéricos, y me preguntaba si había algún idioma que utilizara esta característica particularmente bien.

Realmente no me gusta Java List<? extends Foo> para List de cosas que son sustituibles por Liskov Foo.¿Por qué no puedo? List<Foo> cubrir eso?

Y honestamente, Comparable<? super Bar>?

Tampoco puedo recordar por qué nunca deberías devolver una matriz de genéricos:

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

Nunca me gustaron las plantillas en C++, pero eso se debió principalmente a que ninguno de los compiladores pudo escupirles un mensaje de error remotamente significativo.Una vez realmente hice un make realclean && make 17 veces para conseguir algo para compilar;Nunca supe por qué la decimoséptima vez fue la vencida.

Entonces, ¿quién en realidad gustos ¿Usando genéricos en su lenguaje favorito?

¿Fue útil?

Solución

Haskell implementa bastante bien la parametrización del constructor de tipos (genéricos o polimorfismo paramétrico).También lo hace Scala (aunque a veces necesita un poco de ayuda).

Ambos lenguajes tienen tipos de tipo superior (a.k.a.constructores de tipos abstractos, o polimorfismo de constructores de tipos, o polimorfismo de orden superior).

Mira aquí: Genéricos de tipo superior

Otros consejos

Creo que los genéricos en Java son bastante buenos.La razón por la cual List<Foo> es diferente que List<? extends Foo> es que cuando Foo es un subtipo de Bar, List<Foo> no es un subtipo de List<Bar>.Si pudieras tratar un List<Foo> objeto como un List<Bar>, entonces podrías agregar Bar objetos que puedan romper cosas.Cualquier sistema de tipos razonable requerirá esto.Java te permite salirte con la tuya Foo[] como un subtipo de Bar[], pero esto obliga a realizar comprobaciones en tiempo de ejecución, lo que reduce el rendimiento.Cuando devuelve una matriz de este tipo, al compilador le resulta difícil saber si debe realizar una verificación en tiempo de ejecución.

Nunca he necesitado usar los límites inferiores (List<? super Foo>), pero me imagino que podrían ser útiles para devolver valores genéricos.Ver covarianza y contravarianza.

Sin embargo, en general, estoy definitivamente de acuerdo con las quejas sobre la sintaxis demasiado detallada y los mensajes de error confusos.Los lenguajes con inferencia de tipos como OCaml y Haskell probablemente te facilitarán esto, aunque sus mensajes de error también pueden resultar confusos.

Diablos, el inglés ni siquiera implementa bien los genéricos.:)

Mi preferencia es por C#.Principalmente porque eso es lo que estoy usando actualmente y los he usado con buenos resultados.

Agregaré OCaml a la lista, que realmente tiene genérico genéricos.Estoy de acuerdo en que las clases de tipos de Haskell están muy bien hechas, pero es un poco diferente en el sentido de que Haskell no tiene semántica de OO, pero OCaml sí admite OO.

Utilizo .Net (VB.Net) y no he tenido ningún problema al usar genéricos.Es mayoritariamente indoloro.

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

For Each Car in Cars
...
Next

Nunca tuve ningún problema al usar las colecciones genéricas, aunque no he ido tan lejos como para diseñar ningún objeto que use genéricos por mi cuenta.

Creo que C# y VB.NET hacen un buen trabajo con los genéricos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top