2016-04-12 11 views
1

ich folgendescala Eingabe erfordern implizite

ich ein Elternteil generische Klasse

abstract class ResultProvider[+T: Writes](db: DB) { 
    def get(id: Long): Future[Seq[T]] 
} 

Und einige Implementierungen haben zu bauen bin versucht, z.B.

class LengthProvider(db: DB) extends ResultProvider[LengthResult](db){ 
    override def get (userId: Long): Future[Seq[LengthResult]] = ... 
} 

object LengthProvider extends ((DB) => DisciplinePredictor) { 
    override def apply(db: DB) = new LengthProvider(db) 
} 

Ich habe folgende Konfiguration Karte:

val providers: Map[String, ((DB) => ResultProvider[???])] = Map(
    "length" -> LengthProvider, 
    "width" -> WidthProvider, 
    ... 
) 

Meine Frage ist, was soll ich anstelle von ??? setzen. Idealerweise sollte es so etwas wie T : Writes sein, da es mich nur interessiert, dass dieser Typ Writes implizit implementiert hat, da ich dazu Json.toJson es gehe. Es kompiliert mit Any, aber die Information, die die Klasse implizit Writes implementiert, ist dann verloren. Oder sollte ich einen anderen Ansatz verwenden? Ich könnte wahrscheinlich eine Oberklasse für alle meine Ergebnisfallklassen erstellen (z. B. LengthResult), aber ich möchte mit den implicits davonkommen.

+0

versuchen 'T <: Schreibt –

+0

@AlexanderArendar Das ist nicht das, was überhaupt gewollt ist. –

Antwort

1

Sie sollten in der Lage sein ResultProvider[_] (Suche nach „existentielle Typen“, wenn Sie mit dieser Syntax nicht vertraut sind) zu schreiben, aber Sie einen Namen für die implizite geben müssen:

abstract class ResultProvider[+T](db: DB)(implicit val writes: Writes[T]) { ... } 

In anderen Ländern:

val provider: ResultProvider[_] = providers("length") 
import provider.writes // makes the implicit visible here 
... 

Sie könnten den Compiler helfen müssen (oder sich selbst, wenn Sie den Typ nennen müssen), indem eine Variable vom Typ bereitstellt:

providers("length") match { 
    case provider: ResultProvider[a] => 
    import provider.writes 
    ... 
} 
+0

Es hat funktioniert! Können Sie bitte erläutern, warum ich dem Compiler mit einer Typvariablen (d. H. "A") helfen muss? Es funktioniert nicht anders. –

+0

Leider hängt dies von Details der Typinferenz des Compilers ab, die ich nicht verstehe. Ich war vorher in ähnlichen Situationen. –

Verwandte Themen