Question

J'ai bien aimé la discussion à Les différences dans les Génériques, et je me demandais s'il y a des langues qui ont utilisé cette fonctionnalité particulièrement bien.

Je n'aime vraiment pas Java List<? extends Foo> pour un List des choses qui sont Liskov-substituables pour Foo.Pourquoi pas List<Foo> couvrir cela?

Et honnêtement, Comparable<? super Bar>?

J'ai aussi ne peut pas se souvenir de la vie de mon pourquoi vous devriez ne jamais retourner un Tableau des génériques:

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

Je n'ai jamais aimé les templates en C++, mais c'était surtout parce que aucun des compilateurs ne pourrait jamais cracher à distance le message d'erreur significatif pour eux.Une fois, j'ai fait un make realclean && make 17 fois pour obtenir quelque chose à la compilation;Je n'ai jamais fait comprendre pourquoi la 17e fois était le charme.

Alors, qui fait aime l'utilisation de génériques dans leurs animaux de langue?

Était-ce utile?

La solution

Haskell implémente type constructeur de paramétrage (génériques ou de polymorphisme paramétrique) très bien.Donc ne Scala (bien qu'il a besoin d'un peu de la main-tenant parfois).

Ces deux langues ont de plus-kinded types (un.k.un.type abstrait constructeurs, ou de type constructeur polymorphisme, ou d'ordre supérieur polymorphisme).

Voir ici: Les génériques d'un Genre Plus élevé

Autres conseils

Je pense que la généricité en Java sont en fait assez bonne.La raison pour laquelle List<Foo> est différent de celui List<? extends Foo> c'est que lorsque Foo est un sous-type de Bar, List<Foo> n'est pas un sous-type de List<Bar>.Si vous pouviez traiter une List<Foo> l'objet en tant que List<Bar>, alors vous pourriez ajouter Bar les objets, ce qui pourrait casser des choses.Toute raisonnable type de système aura besoin de ce.Java vous permet de sortir avec le traitement de Foo[] comme un sous-type de Bar[], mais cela force l'exécution des contrôles, la réduction de la performance.Lorsque vous retournez un tel tableau, ce qui rend difficile pour le compilateur de savoir si, à un moment de l'exécution.

J'ai jamais eu besoin d'utiliser les limites inférieures (List<? super Foo>), mais j'imagine qu'ils pourraient être utiles pour le retour des valeurs génériques.Voir la covariance et la contravariance.

Dans l'ensemble cependant, je suis absolument d'accord avec les plaintes au sujet de trop verbeux de la syntaxe et de la confusion des messages d'erreur.Langues avec l'inférence de type, comme OCaml et Haskell va probablement faire cela plus facile pour vous, bien que leurs messages d'erreur peuvent être source de confusion et.

Heck, l'anglais n'est pas à même de mettre en œuvre les génériques bien.:)

Mon parti pris est pour C#.Principalement parce que c'est ce que j'utilise actuellement et je les ai utilisé à bon escient.

Je vais ajouter OCaml à la liste, qui a vraiment générique les génériques.Je suis d'accord que Haskell type de classes sont vraiment bien fait, mais c'est un peu différente, en ce qu'Haskell n'a pas OO de la sémantique, mais OCaml prend en charge OO.

J'utilise .Net (VB.Net), et n'ai pas eu de problèmes à l'aide de médicaments génériques.C'est surtout indolore.

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

For Each Car in Cars
...
Next

Jamais eu de problèmes en utilisant le générique des collections, bien que je n'ai pas été jusqu'à la conception de tous les objets que l'utilisation des génériques sur mon propre.

Je pense que C# et VB.NET faire un bon travail avec les génériques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top