Ich habe folgendes Setup:Wie verwendet man Typinformationen aus dem Mustervergleich?
trait TypeA { override def toString() = "A" }
trait TypeB { override def toString() = "B" }
trait TypeC { override def toString() = "C" }
def foo[T](t: T) = println(t)
nun etwas tun Ich kann:
val valueB: Any = new TypeB {}
val typedValue = valueB match {
case t: TypeA => foo(t)
case t: TypeB => foo(t)
case t: TypeC => foo(t)
}
// prints "B"
Wenn ich dieses Pattern-Matching-Block verallgemeinern wollen, habe ich einfach tun können:
val typedValue = valueB match {
case t => foo(t)
}
und es wird funktionieren. In meinem realen Anwendungsfall muss ich die Typinformationen beim Aufruf der Methode explizit angeben, da es kein Funktionsargument gibt, aus dem sie abgeleitet werden könnte. Also wenn foo()
war eine generische Methode mit Parameter T
parameterisiert, aber ohne tatsächliche Parameter dieses Typs aus zu folgern, kann ich dies in ein Muster mit nur einer Case-Anweisung verallgemeinern (wahrscheinlich mit der Reflection API)?
Also, wie verallgemeinern?
val typedValue = valueB match {
case t: TypeA => foo[TypeA]()
case t: TypeB => foo[TypeB]()
case t: TypeC => foo[TypeC]()
...
}
Diese zu kompilieren erscheint: 'Fall t => foo [t.type] () 'Probieren Sie es aus. – jwvh
Der schwierige Teil ist, wie man den Mustervergleich wirklich den tatsächlichen Typ extrahieren lässt? Ich würde gerne sagen können "val t: Any = ..." und in dem Pattern-Matching-Teil würde ich auf den tatsächlichen Typ übereinstimmen. Siehe die bearbeitete Frage (val valueB ist jetzt vom Typ 'Any'). Wenn 'valueB' vom Typ' Any' deklariert ist, funktioniert Ihr Vorschlag leider nicht, und auch mit einer seltsamen Nachricht (unspezifizierte Wertparameter: t.type). – slouc