Ich habe eine Karte, in der sowohl die Schlüssel als auch die Werte generische Typen sind. Etwas wie das:
%Vor% Was ich ausdrücken möchte, ist, dass der Typ A
für jedes Schlüssel / Wert-Paar in der Map unterschiedlich sein kann, aber jeder Schlüssel immer mit dem gleichen Typ parametrisiert ist wie der Wert, dem er zugeordnet ist. Ein Foo[Int]
wird also immer einem Bar[Int]
zugeordnet, ein Foo[String]
wird immer einem Bar[String]
zugeordnet und so weiter.
Kennt jemand eine Möglichkeit, dies auszudrücken?
BEARBEITEN:
Hier ist ein Beispiel für die Art von Dingen, die ich versuche zu tun:
%Vor%Die Idee ist, dass ein Wert immer einer Funktion zugeordnet wird, die ihn als Parameter akzeptieren kann, aber da der Code jetzt geschrieben wird, kann der Compiler das nicht wissen.
Wie sich herausstellt, ist es möglich, eine heterogene Karte in Scala zu definieren. Hier ist eine grobe Skizze:
%Vor%Dies könnte vollständig typsicher gemacht werden, indem intern eine verknüpfte Liste von Zuordnungen anstelle einer Zuordnung verwendet wird, aber dies ist besser für die Leistung.
Mein ursprüngliches Beispiel würde so aussehen:
%Vor%Das ist fast perfekt, außer dass ich mir nicht sicher bin, wie man Grenzen hinzufügt.
Sie können es vielleicht etwas sicherer machen, indem Sie Manifest
s benutzen, um die Typparameter jedes Schlüssel / Wert-Paares zur Laufzeit zu verifizieren, aber ich bin mir nicht sicher, wie ...
Ich habe eine Karte implementiert, die das macht, was Sie wollen. Sie können hier einige grundlegende Dokumente finden: Ссылка
TypeBoundMaps verwendet Typen mit einem einzigen Typparameter. Daher müssen Sie in der Map einige neue Typen für Ihre Schlüssel- und Werttypen einführen:
%Vor%Jetzt können Sie die gewünschte Karte so erstellen:
%Vor%Hier ein paar Beispiele für die Verwendung der Karte:
%Vor% Um nun die for-Schleife in Ihrem Beispiel nachzuahmen, müssen wir einen neuen Typ TypeBoundPair
einfügen, bei dem es sich um ein Schlüssel / Wert-Paar handelt, bei dem die Parameterwerte übereinstimmen:
Die Idee hinter der Einführung der Typen Identity
und Handler
wird hier genauer erklärt: Ссылка