ich etwas versuchen, dass ich in verschiedenen Formen in verschiedenen Kontexten gesehen habe vor: mit filterById(id: Id)
scala Abfrage Erweiterungen erstreckenScala Compiler folgert Nichts für generische Argumente
Dies ist, was ich versucht habe:
trait TableWithId { self: Profile =>
import profile.simple._
trait HasId[Id] { self: Table[_] =>
def id: Column[Id]
}
implicit class HasIdQueryExt[Id: BaseColumnType, U]
(query: Query[Table[U] with HasId[Id], U]) {
def filterById(id: Id)(implicit s: Session) = query.filter(_.id === id)
def insertReturnId(m: U)(implicit s: Session): Id = query.returning(query.map(_.id)) += m
}
}
Das funktioniert gut, keine echte Magie dort. Aber da es für den Tabellentyp keine Typbeschränkung gibt, verliert jede Abfrage, auf die ich filterById anwende, ihre Spezifität (es ist jetzt ein generischer Table with HasId[Id]
), und ich kann ihre Spalten nicht mehr erreichen (außer natürlich _.id
).
Ich weiß nicht, wie Sie diese implizite Konvertierung eingeben, so dass dies verhindert wird. Ist es möglich? Die folgende „naieve“ Lösung funktioniert nicht, weil Scala Nichts für den Id-Typen folgert nun:
implicit class HasIdQueryExt[Id: BaseColumnType, U, T <: Table[U] with HasId[Id]]
(query: Query[T, U]) { ... }
Ich finde es irgendwie seltsam, dass plötzlich der Id-Typ wie nichts zu entnehmen ist. Wie kann ich dem Compiler mitteilen, wo er nach diesem ID-Typ suchen soll?
Ich bin nicht mit Slick vertraut, aber meine Vermutung ist, dass Ihre Lösung einen generischen Parameter erfordern würde das nimmt den tatsächlichen Typ deiner Tabelle an ... etwas wie 'HasId [Id, T <: HasId [Id, T]]'. Dann können Sie den eigentlichen Typ der Tabelle mit HasId als Parameter T übergeben. Edit: Haben Sie auch versucht, Strukturtypen zu verwenden? http://java.dzone.com/articles/duck-typing-scala-structural Dies wird Reflexion verwenden, aber geben Sie noch statische Sicherheit. –
Ich sehe nicht, wie das anders ist als der Ansatz, den ich zuletzt aufgeschrieben habe. Sind das nicht gleichwertig? Und ich glaube nicht, dass strukturelle Typisierung in diesem Fall hilft. Das Problem behält seine Struktur bei. –