Несоответствие типа, ожидающее NotInferedR

#scala #slick

#scala #скользкий

Вопрос:

Я пытаюсь заставить базовое рабочее доказательство работать, но получаю ошибку несоответствия типа из этой строки:

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

В частности, User.tupled и User.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:

Поздний ответ, но я только что столкнулся с той же проблемой и нашел это сообщение без ответа. К сожалению, я не смог выяснить, почему это не работает. Я видел примеры написания этого так, как вы это сделали, но, возможно, в этих примерах используется версия Scala старше 2.12? В любом случае, я обнаружил, что использование mapTo работает для меня. Итак, в вашем случае это было бы:

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

(Я думаю, что name также необходимо, .? поскольку name это Option[String] в классе User, а name столбец определяется как String )