2016-07-31 24 views
2

Ich habe versucht, Slick mit dem generischen JdbcDriver zu verwenden, und habe in einen Scala-Typ-Mismatch-Fehler geraten. Wenn ich dies ohne Slick und Roll-My-Own versuchen super einfache Tabelle & TableQuery Mocks das Problem nicht auftritt, so glaube, dass der Fehler im Zusammenhang mit einigen von Slicks anspruchsvolleren Einsatz von Scala.Typenkonflikt beim Versuch, generische JdbcDriver-Verwendung in Slick/Scala zu verwenden

Das folgende Beispiel verwendet Slick 3.1.1. Ich habe auch das Äquivalent mit Slick 3.2.0-M1 versucht (Treiber zum Profil wo notwendig ändern), aber der gleiche Fehler ist vorhanden.

Es scheint eine Reihe von 'Typ-Mismatch'-Fragen/Antworten auf StackOverflow zu geben, aber ich kann nicht interpretieren, wenn sie mit diesem Problem zusammenhängen, daher wird jede Hilfe zur Verbesserung meiner Scala/Slick-Verwendung geschätzt.

Der folgende Code erzeugt:

*Error:(37, 25) type mismatch; 
found : slick.lifted.TableQuery[dao.PersonTable] 
required: slick.lifted.TableQuery[_ <: _2.driver.Table[_]] where val _2: test.Test.ProfileUser 
    dbDriver.create(dao.persons) // Creates this error...* 

package test 

import slick.backend.DatabaseConfig 
import slick.driver.JdbcDriver 

trait GenericDriver { 
    val driver: JdbcDriver 
} 

case class PersonRecord(id: Int, name: String) 

trait Person { 
    self: GenericDriver => 

    import driver.api._ 

    class PersonTable(tag: Tag) extends Table[PersonRecord](tag, "persons") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def name = column[String]("name") 
    def * = (id, name) <> (PersonRecord.tupled, PersonRecord.unapply) 
    } 

    val persons = TableQuery[PersonTable] 
} 

class Dao(val driver: JdbcDriver) 
    extends Person 
    with GenericDriver 

object Test { 

    def main(args: Array[String]): Unit = { 
    val dbConfig = DatabaseConfig.forConfig[JdbcDriver]("sampleDb") 
    val dbDriver = dbConfig.driver 
    val dao = new Dao(dbDriver) 

    dbDriver.create(dao.persons) // Creates this error... 
    // 
    // Error:(37, 25) type mismatch; 
    // found : slick.lifted.TableQuery[dao.PersonTable] 
    // required: slick.lifted.TableQuery[_ <: _2.driver.Table[_]] where val _2: test.Test.ProfileUser 
    // dbDriver.create(dao.persons) // Creates this error... 
    // 
    } 

    implicit class ProfileUser(val driver: JdbcDriver) extends GenericDriver { 
    import driver.api._ 
    def create(tq: TableQuery[_ <: Table[_]]) = tq.schema.create 
    } 

} 

Für info - build.sbt ist:

name := "test_import" 

version := "1.0" 

scalaVersion := "2.11.8" 

libraryDependencies ++= Seq(
    "com.typesafe.slick" %% "slick" % "3.1.1" 
) 
+0

ich auch diese mit 'Import driver.profile.api._' versucht habe. Dies erzeugt jedoch eine ähnliche Fehlermeldung: 'Fehler: (37, 25) Typ Mismatch; gefunden: dao.driver.profile.api.TableQuery [_ $ 1] wo Typ _ $ 1 <: dao.driver.profile.api.Table [_] (die erweitert wird) slick.lifted.TableQuery [_ $ 1] erforderlich: slick.lifted.TableQuery [_ <: _2.driver.profile.Table [_]] wobei val _2: test.Test.ProfileUser dbDriver.create (dao.persons) ' –

Antwort