Scala的隐式参数解析很困难

时间:2013-12-09 20:27:04

标签: scala implicit slick

我有以下代码,导致编译错误,因为编译器(2.10.3)无法找到方法调用的隐式参数:

package (...).construcao.light

import scala.slick.jdbc.{ GetResult, StaticQuery => Q }
import scala.slick.session.Session

import (...).rede.Rede
import (...).rede.TipoVista._
import (...).rede.construcao.SQLConnectionFactory
import (...).rede.construcao.SQLLoader
import (...).rede.construcao.SQLReader
import (...).rede.entidade.Bloco
import (...).rede.entidade.EstadoAbertura.estado

class BlocoSQLLoader(deps: {
  val fabricaConexoes: SQLConnectionFactory
  val leitorSQL: SQLReader
}) extends SQLLoader {

  import BlocoSQLLoader._

  def carregar(subestacao: String, alimentador: String, vista: TipoVista, rede: Rede) {
  }

  def pesquisarBlocos(subestacao: String, alimentador: String, vista: TipoVista) = {
    deps.fabricaConexoes.conexao(vista) withSession { implicit sessao: Session =>
      val b = Q.query[(String, String), Bloco](deps.leitorSQL("rede.blocosAlimentador"))
      b(subestacao, alimentador).list
    }
  }

}

object BlocoSQLLoader {

  import scala.language.implicitConversions

  implicit val getResultadoBloco = GetResult(r => new Bloco(
    idEquipamento = r.<<, pelFonte = r.<<, pelCarga = r.<<, idBlocoFonte = r.<<, idBlocoCarga = r.<<,
    refAlimentador = r.<<, refAlimentadorOrigem = r.<<, nome = r.<<, seccionamento = estado(r.<<),
    estado = estado(r.<<), cor = r.<<)
  )

}

val b = Q.query[(String, String), Bloco](deps.leitorSQL("rede.blocosAlimentador"))行打破了编译,因为找不到implicit val getResultadoBloco(在object BlocoSQLLoader上)。我认为编译器试图在类伴随对象上找到隐式参数。我在这里做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

前向隐式引用必须具有显式类型。因此,要么在类声明之前移动object BlocoSQLLoader,要么将隐式声明更改为

implicit val getResultadoBloco: WhateverThisTypeIsSupposedToBe = ...