首页 > 解决方案 > 期望 NotInferedR 的类型不匹配

问题描述

我试图让一个基本的工作 Slick 证明工作,但我从这一行得到一个类型不匹配错误:

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]
}

如何解决这种不匹配?

标签: scalaslick

解决方案


迟到的答案,但我刚刚遇到了同样的问题,发现了这个未答复的帖子。不幸的是,我无法弄清楚为什么它不起作用。我已经看到示例按照您的方式编写,但也许这些示例使用的是早于 2.12 的 Scala 版本?无论如何,我发现 usingmapTo对我有用。因此,在您的情况下,它将是:

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

(我认为 name 也需要.?,因为在 User 类中是 a ,并且该name列被定义为 a )Option[String]nameString


推荐阅读