2008-09-08 13 views
7

Me gustó la discusión en Differences in Generics, y me preguntaba si había algún idioma que usara esta característica particularmente bien.¿Hay algún lenguaje que implemente genéricos _well_?

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

Y, sinceramente, Comparable<? super Bar>?

Tampoco puedo recordar por la vida de mi por qué nunca debe devolver una matriz de genéricos:

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

nunca plantillas gustado en C++, pero eso fue todo porque ninguno de los compiladores jamás podría escupe un mensaje de error remotamente significativo para ellos. Una vez hice realmente un make realclean && make 17 veces para obtener algo para compilar; Nunca entendí por qué la decimoséptima vez fue el encanto.

Entonces, ¿quién realmente le gusta usando genéricos en su lenguaje de mascotas?

+0

Debería ser wiki comunitario. –

+0

Me parece bien :) –

Respuesta

14

Haskell implementa la parametrización del constructor de tipos (genéricos o polimorfismo paramétrico) bastante bien. Lo mismo ocurre con Scala (aunque a veces necesita un poco de control de manos).

Ambos idiomas tienen tipos de alto grado (por ejemplo, constructores de tipo abstracto, o polimorfismo de tipo constructor o polimorfismo de orden superior).

Ver aquí: Generics of a Higher Kind

7

Heck, Inglés ni siquiera implementar bien genéricos. :)

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

1

Uso .Net (VB.Net) y no he tenido problemas para usar genéricos. Es casi indoloro.

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

For Each Car in Cars 
... 
Next 

Nunca he tenido ningún problema usando las colecciones genéricas, aunque no he ido tan lejos como para diseñar los objetos que utilizan los genéricos por mi cuenta.

7

Creo que los genéricos en Java son bastante buenos. La razón por la que List<Foo> es diferente de List<? extends Foo> es que cuando Foo es un subtipo de Bar, List<Foo> no es un subtipo de List<Bar>. Si pudiera tratar un objeto List<Foo> como List<Bar>, podría agregarle Bar objetos, lo que podría romper cosas. Cualquier sistema de tipo razonable requerirá esto. Java le permite salirse con la suya tratando el Foo[] como un subtipo de Bar[], pero esto fuerza las comprobaciones del tiempo de ejecución, reduciendo el rendimiento. Cuando devuelve dicha matriz, esto hace que sea difícil para el compilador saber si debe hacer una verificación en tiempo de ejecución.

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

En general, definitivamente estoy de acuerdo con las quejas sobre una sintaxis demasiado detallada y mensajes de error confusos.Los idiomas con inferencia de tipo como OCaml y Haskell probablemente lo harán más fácil, aunque sus mensajes de error también pueden ser confusos.

+0

Estoy de acuerdo con usted, pero tengo dos cosas que señalar: el borrado de tipo puede ser un dolor a veces, y no puede usar tipos primitivos con genéricos. –

3

Voy a agregar OCaml a la lista, que realmente tiene genéricos 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 OO, pero OCaml sí admite OO.

0

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

Cuestiones relacionadas