Es ist allgemein anerkannt, dass Java-Generika auf einige wichtige Arten versagt haben. Die Kombination von Platzhaltern und Schranken führte zu ernsthaft unlesbarem Code.
Wenn ich mir jedoch andere Sprachen anschaue, kann ich anscheinend kein generisches Typsystem finden, mit dem Programmierer zufrieden sind.
Nehmen wir als Entwurfsziele eines solchen Typsystems:
- Erzeugt immer leicht lesbare Typdeklarationen
- Einfach zu erlernen (Kovarianz, Kontravarianz usw. müssen nicht aufgefrischt werden)
- Maximiert die Anzahl der Fehler bei der Kompilierung
Gibt es eine Sprache, die es richtig macht? Wenn ich google, sehe ich nur Beschwerden darüber, wie das Typsystem in der Sprache X funktioniert. Ist diese Komplexität mit der generischen Typisierung verbunden? Sollten wir einfach aufhören, die Typensicherheit bei der Kompilierung zu 100% zu überprüfen?
Meine Hauptfrage ist, in welcher Sprache diese drei Ziele am besten erreicht wurden. Mir ist klar, dass das subjektiv ist, aber ich kann noch nicht einmal eine Sprache finden, in der nicht alle Programmierer der Meinung sind, dass das generische Typensystem ein Chaos ist.
Nachtrag: Wie bereits erwähnt, ist die Kombination von Subtypisierung / Vererbung und Generika das, was die Komplexität erzeugt. Daher suche ich wirklich nach einer Sprache, die beides kombiniert und die Explosion der Komplexität vermeidet.
Foo<T> where SiameseCat:T
), und dass es keine Möglichkeit gibt, einen generischen Typ zu haben, der nicht konvertierbar ist Object
. Meiner Meinung nach würde .NET von Aggregattypen profitieren, die strukturähnlich, aber noch bloßer sind. Wenn KeyValuePair<TKey,TValue>
es sich um einen solchen Typ handelt, kann auf einen umgewandelt IEnumerable<KeyValuePair<SiameseCat,FordFocus>>
werden IEnumerable<KeyValuePair<Animal,Vehicle>>
, jedoch nur, wenn der Typ nicht in ein Kästchen eingeschlossen werden kann.
easy-to-read type declarations
? Das dritte Kriterium ist ebenfalls nicht eindeutig: Beispielsweise kann ich Array-Index-Ausnahmen außerhalb der Grenzen in Fehler bei der Kompilierung umwandeln, indem Sie keine Arrays indexieren lassen, es sei denn, ich kann den Index zur Kompilierungszeit berechnen. Das zweite Kriterium schließt auch die Untertypisierung aus. Das ist nicht unbedingt eine schlechte Sache, aber Sie sollten sich dessen bewusst sein, was Sie fragen.