2013-12-09 54 views
1

我有下面的代碼,這是導致編譯錯誤,因爲編譯器(2.10.3)是無法找到一個方法調用的隱含參數:很難與Scala的隱含參數分辨率

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.<<) 
) 

} 

的因爲沒有找到implicit val getResultadoBloco(在object BlocoSQLLoader),所以行val b = Q.query[(String, String), Bloco](deps.leitorSQL("rede.blocosAlimentador"))暫停編譯。我認爲編譯器試圖在類伴侶對象上找到隱式參數。我在這裏做錯了什麼?

謝謝!

+0

你嘗試明確地傳遞getResultadoBloco在第二個參數列表Q.query? – cvogt

+1

如果您有錯誤消息,請提供錯誤消息。這是有原因的。 –

+0

@cvogt是的,它在我將該調用顯式化並且在將隱式聲明放在類中時起作用。 –

回答

1

前向隱式引用必須具有顯式類型。因此,無論在類聲明之前移動object BlocoSQLLoader,或改變隱含聲明

implicit val getResultadoBloco: WhateverThisTypeIsSupposedToBe = ... 
+0

成功!我不知道隱式值必須有明確的類型聲明。但是,讓隱含更明確是有道理的。 :-) –