2015-06-04 7 views
2

Я играю с новым DBIO apio 3.0.0, но у меня проблемы с дженериками.Слизистый стол не принимает параметр типа

С помощью этого кода:

import scala.concurrent._ 

import slick.driver.MySQLDriver.api._ 
import slick.lifted.AbstractTable 

object Crud { 

    def fetchById[T: AbstractTable[R], R](db: Database, table: TableQuery[T], id: Int, rowId: T => Rep[Int]): Future[Option[T]] = { 
    val fetchByIdQuery: Query[T, R, Seq] = table.filter(row => rowId(row) === id) 

    db.run(fetchByIdQuery.result) 
    } 
} 

Компилятор говорит, что AbstractTable не принимает никаких параметров типа. Я не понимаю этого с декларацией, как здесь. https://github.com/slick/slick/blob/3.0/slick/src/main/scala/slick/lifted/AbstractTable.scala.

slick.lifted.AbstractTable[R] does not take type parameters 
def fetchById[T: AbstractTable[R], R](db: Database, table: TableQuery[T], id: Int, rowId: T => Rep[Int]): Future[Option[T]] = { 

Я подозреваю, что это также является причиной этой ошибки.

type mismatch; 
found : slick.lifted.Query[T,T#TableElementType,Seq] 
required: slick.driver.MySQLDriver.api.Query[T,R,Seq] 
    (which expands to) slick.lifted.Query[T,R,Seq] 
    val fetchByIdQuery: Query[T, R, Seq] = table.filter(row => rowId(row) === id) 

Любой совет?

ответ

0

Попробуй так

T <: AbstractTable[R] // instead of T : AbstractTable[R] 

поэтому он должен выглядеть как показано ниже

Object Crud { 
def fetchById[T <: AbstractTable[R], R](db: Database, table: TableQuery[T], id: Int, rowId: T => Rep[Int]) 
: Future[Option[T#TableElementType]] = { 
    val fetchByIdQuery = table.filter(row => rowId(row) === id) 
    db.run(fetchByIdQuery.result.headOption) 
} 
} 
+0

Спасибо, что работает! Не понял, что головной вариант может также использоваться в качестве действия. – Frawr

Смежные вопросы