Vermeidung überflüssiger generischer Parameter in Scala

8

Dies ist also ein ziemlich direkter Port von dieser Java-Frage zu scala

Wir haben eine Reihe von Merkmalen, die generische Parameter wie folgt annehmen:

%Vor%

Das funktioniert, aber es ist ein wenig unübersichtlich, da wir beim Definieren einer Unterklasse von Entity den Typ des Ident und den Typ des Containers angeben müssen. Wenn tatsächlich nur der Typ des Containers ausreichen würde, geben Sie die Informationen selbst ein:

%Vor%

Die Verwendung eines existentiellen Typs verhindert, dass Entity zwei Parameter annehmen muss ... aber natürlich können Sie später nicht darauf verweisen.

%Vor%

Ähnlich verhält es sich mit der Konvertierung der Sache, um Member-Typen zu verwenden ...

%Vor%

Wer weiß also, ob es in Scala eine elegante Lösung für dieses Problem gibt?

    
Tom Shackell 09.11.2016, 15:59
quelle

1 Antwort

4

Aktualisieren diese Antwort Ich bin mir nicht sicher, ob das so sein sollte als Fehler angesehen oder nicht

Sie haben SI-4377 gedrückt; Wenn Sie explizite Umschreibungen eingeben erhalten Sie ein Irrtum, den ich vermute, macht nur deutlich, dass Typenprojektionen mit Hilfe von Existenzen implementiert werden:

%Vor%

Es ist keine Untertreibung zu sagen, dass dies (Bug?) generische Programmierung mit Typ-Mitgliedern zu einem Albtraum macht.

There ist ein Hack, der darin besteht, -Werte in einen handgefertigten selbstreferentiellen Alias ​​umzuwandeln:

%Vor%

Benutze es jetzt und Entity kompiliert:

%Vor%

Das ist natürlich gefährlich, und als Faustregel ist es nur dann sicher, wenn C und alle seine Typ-Member an dem Punkt, an dem es verwendet wird, an einen nicht-abstrakten Typ gebunden sind; Beachten Sie, dass dies nicht immer der Fall sein wird, da Sie mit Scala "nicht definierte" Mitglieder hinterlassen können:

%Vor%     
Eduardo Pareja Tobes 09.11.2016, 18:02
quelle

Tags und Links