Scala: Oracle JDB C generi c с иглой - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь передать обобщенный класс в качестве параметра. Если я даю класс Case и значения, то он работает нормально. Но хотел бы сделать его обобщенным c.

class DB[T] {
  lazy val ctx = new OracleJdbcContext(SnakeCase, "ctx")

  import ctx._

  def insert(input: T) = {
    val q = quote {
      query[T].insert(lift(input))
    }
    ctx.run(q)

  }

}

Я получаю сообщения об ошибках: «Не удается найти неявное SchemaMeta для типа T Не удается найти кодировщик для типа» 'T'. Обратите внимание, что кодировщики инвариантны "

Но, если я назову фактическое имя класса, тогда все будет хорошо.

case class Location(street:String,pinCode:Int)

class DB {
  lazy val ctx = new OracleJdbcContext(SnakeCase, "ctx")
  import ctx._
  val q = quote {
      query[Location].insert(Location("2ndcross",500001))
    }
    ctx.run(q)

}

1 Ответ

1 голос
/ 28 февраля 2020

Вам необходимо иметь SchemaMeta[T] в области видимости, чтобы иметь возможность выполнять запросы с использованием этого типа. Дурацкое решение было бы потребовать его как ограничение параметра (и, следовательно, неявный параметр класса), например

class DB[T: SchemaMeta]

, но это не сработало бы, потому что ctx обеспечивает эти экземпляры.

Я полагаю, что вам нужно следовать приведенным здесь примерам: https://getquill.io/#contexts -dependent-contextxts Но даже тогда то, что вы хотите, может оказаться недостижимым.

При работе с иглой важно понимать, что почти все, что там происходит, основано на макросах, и если вы абстрагируете вещи, то для работы этих макросов недостаточно информации. Поэтому вам нужно либо дублировать код, требующий макросов, либо обернуть код, который должен быть обобщенным c, в ваш собственный макрос.

...