类型不匹配,预期为NotInferedR

时间:2019-03-20 20:46:06

标签: scala slick

我正在尝试使Slick证明工作正常,但是从此行中出现Type Mismatch错误:

def * : MappedProjection[Nothing, (Option[Int], String)] = (id.?, name) <> (User.tupled, User.unapply)

具体来说,User.tupledUser.unapply分别具有以下错误:

Type mismatch, expected: Option[(Option[Int], String)] => NotInferedR, actual: Option[(Option[Int], String)] => User

Type mismatch, expected: NotInferedR => Option[(Option[Int], String)], actual: User => option[(Option[Int], String)]

我不知道为什么编译器认为应该是NotInferedR;我找不到与此相关的任何文档,并且多本教程似乎都认为足够了。

这是我的package.scala文件:

package nford

import slick.basic.DatabaseConfig
import slick.jdbc.JdbcProfile

package object domain {
  trait DatabaseBacking {
    val config: DatabaseConfig[JdbcProfile]
    val db: JdbcProfile#Backend#Database = config.db
  }
}

这是我的User.scala文件:

package nford.domain

import nford.domain
import slick.basic.DatabaseConfig
import slick.dbio.DBIOAction
import slick.jdbc.JdbcProfile
import slick.lifted.{Index, MappedProjection}

import scala.concurrent.Future

case class User(id: Option[Int], name: Option[String])

trait UserTable {
  this: DatabaseBacking =>

  import config.profile.api._

  private class User(tag: Tag) extends Table[User](tag, "user") {
    def id: Rep[Int] = column[Int]("id", O.PrimaryKey, O.AutoInc)
    def name: Rep[String] = column[String]("name")

    def * : MappedProjection[Nothing, (Option[Int], String)] = (id.?, name) <> (User.tupled, User.unapply)
  }

  val user = TableQuery[User]
}

如何解决这种不匹配?

1 个答案:

答案 0 :(得分:1)

最新答案,但我遇到了同样的问题,却发现了这个未答复的帖子。不幸的是,我无法弄清为什么为什么不起作用。我已经看到一些示例,就像您所做的那样编写,但是也许这些示例使用的是2.12之前的Scala版本?无论如何,我发现使用mapTo对我有效。因此,在您的情况下,它将是:

def * : ProvenShape[User] = (id.?, name.?).mapTo[User]

(我认为名称也需要.?,因为name是User类中的Option[String],并且name列定义为String