Frage

Mir hat die Diskussion gefallen Unterschiede bei Generika, und habe mich gefragt, ob es Sprachen gibt, die diese Funktion besonders gut nutzen.

Ich mag Java wirklich nicht List<? extends Foo> Für ein List von Dingen, die durch Liskov ersetzbar sind Foo.Warum nicht List<Foo> das abdecken?

Und ehrlich gesagt, Comparable<? super Bar>?

Ich kann mich auch nicht in meinem Leben daran erinnern, warum Sie niemals ein Array von Generika zurückgeben sollten:

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

Ich mochte Vorlagen in C++ nie, aber das lag hauptsächlich daran, dass keiner der Compiler jemals eine auch nur annähernd aussagekräftige Fehlermeldung für sie ausspucken konnte.Einmal habe ich tatsächlich eine gemacht make realclean && make 17 Mal, um etwas zum Kompilieren zu bekommen;Ich habe nie herausgefunden, warum das 17. Mal der Reiz war.

Also, wer eigentlich Likes Generika in ihrer Lieblingssprache verwenden?

War es hilfreich?

Lösung

Haskell implementiert die Typkonstruktorparametrisierung (Generika oder parametrischer Polymorphismus) recht gut.Das gilt auch für Scala (obwohl es manchmal etwas Händchenhalten erfordert).

Beide Sprachen haben höherwertige Typen (auch bekannt alsabstrakte Typkonstruktoren oder Typkonstruktor-Polymorphismus oder Polymorphismus höherer Ordnung).

Siehe hier: Generika der höheren Art

Andere Tipps

Ich denke, die Generika in Java sind eigentlich ziemlich gut.Der Grund warum List<Foo> ist anders als List<? extends Foo> ist das wann Foo ist ein Untertyp von Bar, List<Foo> ist kein Subtyp von List<Bar>.Wenn Sie a behandeln könnten List<Foo> Objekt als List<Bar>, dann könnte man hinzufügen Bar Gegenstände darauf, die Dinge zerstören könnten.Jedes vernünftige Typsystem erfordert dies.Mit Java kommen Sie mit der Behandlung davon Foo[] als Untertyp von Bar[], aber dadurch werden Laufzeitprüfungen erzwungen, was die Leistung verringert.Wenn Sie ein solches Array zurückgeben, kann der Compiler nur schwer erkennen, ob eine Laufzeitprüfung durchgeführt werden soll.

Ich musste nie die unteren Grenzen verwenden (List<? super Foo>), aber ich könnte mir vorstellen, dass sie für die Rückgabe allgemeiner Werte nützlich sein könnten.Sehen Kovarianz und Kontravarianz.

Im Großen und Ganzen stimme ich jedoch den Beschwerden über eine zu ausführliche Syntax und verwirrende Fehlermeldungen auf jeden Fall zu.Sprachen mit Typinferenz wie OCaml und Haskell werden Ihnen dies wahrscheinlich erleichtern, obwohl ihre Fehlermeldungen ebenfalls verwirrend sein können.

Verdammt, Englisch implementiert nicht einmal Generika gut.:) :)

Ich bevorzuge C#.Hauptsächlich, weil ich sie derzeit verwende und sie mit gutem Erfolg eingesetzt habe.

Ich werde OCaml zur Liste hinzufügen, was wirklich der Fall ist generisch Generika.Ich stimme zu, dass die Typklassen von Haskell wirklich gut gemacht sind, aber es ist ein bisschen anders, da Haskell keine OO-Semantik hat, OCaml aber OO unterstützt.

Ich verwende .Net (VB.Net) und hatte keine Probleme mit der Verwendung von Generika.Es ist größtenteils schmerzlos.

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

For Each Car in Cars
...
Next

Ich hatte nie Probleme mit der Verwendung der generischen Sammlungen, obwohl ich noch nicht so weit gegangen bin, selbst Objekte zu entwerfen, die generische Sammlungen verwenden.

Ich denke, dass C# und VB.NET mit Generika gute Arbeit leisten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top