Gibt es Sprachen, die Generics _well_ implementieren?

7

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?

    
James A. Rosen 23.05.2017, 12:19
quelle

6 Antworten

14

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

    
Apocalisp 21.01.2010, 02:29
quelle
7

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.

    
Jay Conrod 09.09.2008 00:36
quelle
7

Heck, Englisch implementiert Generika nicht einmal gut. :)

Meine Voreingenommenheit ist für C #. Hauptsächlich weil ich das gerade verwende und ich sie gut genutzt habe.

    
Craig 20.01.2010 21:29
quelle
3

Ich füge OCaml zu der Liste hinzu, die wirklich generische Generika enthält. Ich stimme zu, dass Haskells Typklassen wirklich gut gemacht sind, aber es ist etwas anders, da Haskell keine OO-Semantik hat, aber OCaml unterstützt OO.

    
airportyh 09.09.2008 01:05
quelle
1

Ich benutze .Net (VB.Net), und hatte keine Probleme mit Generika. Es ist meistens schmerzlos.

%Vor%

Hatte nie Probleme mit den generischen Sammlungen, obwohl ich nicht so weit gegangen bin, irgendwelche Objekte zu entwerfen, die selbst Generika benutzen.

    
Kibbee 09.09.2008 00:07
quelle
0

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

    
Kevin Kershaw 09.09.2008 14:20
quelle

Tags und Links