Ich mochte die Diskussion in Unterschiede in Generics und fragte mich, ob es Sprachen gab, die verwendet wurden Diese Funktion besonders gut.
Ich mag Javas List<? extends Foo>
für ein List
der Dinge, die Liskov-substituierbar für Foo
sind. Warum kann List<Foo>
das nicht abdecken?
Und ehrlich gesagt, Comparable<? super Bar>
?
Ich kann mich auch nicht mehr erinnern, warum du niemals ein Array von Generika zurückgeben solltest:
%Vor% Ich mochte Templates in C ++ nie, aber das lag hauptsächlich daran, dass keiner der Compiler jemals eine für sie aussagekräftige Fehlermeldung ausspucken konnte. Einmal habe ich tatsächlich ein make realclean && make
17 mal gemacht um etwas zu kompilieren; Ich habe nie herausgefunden, warum das 17. Mal der Charme war.
Wer mag also Generika in seiner Haustiersprache?
Haskell implementiert die Typenkonstruktorparametrisierung (Generika oder parametrischer Polymorphismus) sehr gut. So auch Scala (obwohl es manchmal ein wenig Handhaltung erfordert).
Beide Sprachen haben höherwertige Typen (abstrakte Konstruktypen für den abstrakten Typ oder Typkonstruktorpolymorphismus oder Polymorphismus höherer Ordnung).
Siehe hier: Generika einer höheren Art
Ich denke, die Generika in Java sind eigentlich ziemlich gut. Der Grund, warum List<Foo>
sich von List<? extends Foo>
unterscheidet, liegt darin, dass Foo
kein Untertyp von Bar
ist, wenn List<Foo>
ein Untertyp von List<Bar>
ist. Wenn Sie ein List<Foo>
-Objekt als List<Bar>
behandeln könnten, könnten Sie Bar
-Objekte hinzufügen, was Dinge beschädigen könnte. Jedes vernünftige System erfordert dies. Java macht es Ihnen möglich, Foo[]
als Untertyp von Bar[]
zu behandeln, aber dies erzwingt Laufzeitprüfungen und verringert die Leistung. Wenn Sie ein solches Array zurückgeben, ist es für den Compiler schwierig zu wissen, ob eine Laufzeitprüfung durchgeführt werden soll.
Ich brauchte nie die unteren Grenzen ( List<? super Foo>
), aber ich würde mir vorstellen, dass sie nützlich sein könnten, um generische Werte zurückzugeben. Siehe Kovarianz und Kontravarianz .
Im Großen und Ganzen stimme ich allerdings den Beschwerden über übertriebene Syntax und verwirrende Fehlermeldungen zu. Sprachen mit Typinterferenzen wie OCaml und Haskell werden Ihnen das wahrscheinlich erleichtern, obwohl ihre Fehlermeldungen auch verwirrend sein können.
Ich denke, dass C # und VB.NET bei Generika gute Arbeit leisten.
Tags und Links language-agnostic generics