2017-04-12 77 views
0

所以我想实现一个trait有一个共同的执行功能来运行slick的查询。浮油斯卡拉方法推断泛型

正如你从下面的代码中可以看到的,我有一个特性在类上有一个类型参数,另一个在方法上定义了类型参数。

当我编译时,方法泛型类型的特征编译(没有给出任何类型参数),但另一个没有。

为什么?我试图给类类型参数UserTable或用户(我光滑的表格def和投影案例类),但他们都没有工作。错误只是说“期望DBIO [UserTable],但实际MySQLDriver.StreamingDriverAction”

任何帮助真的很感激。

非常感谢!

class DAO @Inject()(val configProvider: DatabaseConfigProvider) extends 
    ManagementAppDatabase { 
    private val users = TableQuery[UserTable] 

    def findUserByEmail(email: String): Future[Option[User]] = { 
    execute(users.filter(_.email === email).result.headOption) 
    } 
} 

trait ManagementAppDatabase { 
    val configProvider: DatabaseConfigProvider 
def execute[T](dBIO:DBIO[T]): Future[T] = configProvider.get[JdbcProfile].db.run(dBIO) 
} 

trait ManagementAppDatabase[T] { 
    val configProvider: DatabaseConfigProvider 
def execute (dBIO:DBIO[T]):Future[T]=configProvider.get[JdbcProfile].db.run(dBIO) 
} 

回答

1

如果将例如ManagementAppDatabase[User],那么你只能拨打 DBIO[User]。但users.filter(_.email === email).result.headOptionDBIO[Option[User]]。而已。

+0

啊,我很感谢!只是一个附加问题,如果可以回答,我真的很感激它。那么在这种情况下,Scala如何推断类型参数(因为我没有给出具体的类型参数)?和/或Scala如何总体推断这种类型? –

+0

在这种情况下,'execute'没有一个类型参数来首先推断。而回答第二个问题则不适合问题。 –

+0

谢谢。我已经创建了一个单独的问题:(http://stackoverflow.com/questions/43381289/scala-method-inferred-generic-type)真的很感激它,如果你能回答! –