Ich habe einige Probleme mit Scala, um aus einer Typprojektion den richtigen Typ abzuleiten.Wie kann man aus einem Projektionstyp den richtigen Typparameter ableiten?
Beachten Sie Folgendes:
trait Foo {
type X
}
trait Bar extends Foo {
type X = String
}
def baz[F <: Foo](x: F#X): Unit = ???
Dann folgendes kompiliert fein:
val x: Foo#X = ???
baz(x)
aber die folgenden nicht kompiliert:
val x: Bar#X = ???
baz(x)
Scala „zugrunde liegender Typ String sieht "für x
, aber hat die Information verloren, dass x
ist ein Bar#X
. Es funktioniert gut, wenn ich den Typ mit Anmerkungen versehen:
baz[Bar](x)
Gibt es eine Möglichkeit, die richtige Art Parameter für baz
zu machen Scala ableiten?
Wenn nicht, was ist die allgemeine Antwort, die es unmöglich macht?
Keine Antwort, aber es ist erwähnenswert, dass, wenn Sie 'x' mit einem Typenbezeichner statt einer Typprojektion eingeben, es funktioniert - einschließlich z. 'Objekt BAR erweitert Bar; val x: BAR.X = "a"; baz (x) '. –
Auch erwähnenswert: Sie können den Compiler davon überzeugen, dass Sie wirklich _do_ wollen 'x' als etwas mehr oder weniger wie' Bar # X' mit dem unglaublich hässlichen 'val x: bX forSome {val b: Bar} =" a ": bX für etwas {val b: Bar}'. –
Scheint wie seltsamer Anwendungsfall. Warum willst du das machen? –