【问题标题】:Could not find implicit value for parameter c: anorm.Column[Float]找不到参数 c 的隐式值:anorm.Column[Float]
【发布时间】:2014-04-28 12:13:04
【问题描述】:

我收到了类似的问题,但对我没有帮助。 (Anorm parse float values)。

老实说,我不明白那个问题的解决方案。
我收到此编译时间错误:

could not find implicit value for parameter c: anorm.Column[Float]

def getInformation(id: Long): List[(Float, Float, Float)] = {
    DB.withConnection { implicit con =>
      val query = SQL("select principal,interest,value from myTable where userId={id} and status=true").on("id"->id)
      val result = query().map { row =>
        Tuple3(row[Float]("principal"), row[Float]("inetrest"), row[Float]("value"))
       //      ^
      }.toList
      return result
    }
  }

【问题讨论】:

  • 您的范围内是否有一个所述类型的变量被标记为隐式? (只需在 val 前加上 implicit
  • 您在这个问题上需要更多帮助吗?

标签: mysql sql scala playframework anorm


【解决方案1】:

也许对隐式的简短回顾会对您有所帮助。让我们构建一个非常基本的例子:

// some class which will be used as implicit (can be anything)
case class SomeImplicitInformation(maybe: Int, with: Int, data: Int)

// lets assume we have a function that requires an implicit
def functionRequiringImplicit(regularParameters: Int)(implicit imp: SomeImplicitInformation) {
  // ...
}

// now if you try to call the function without having an implicit in scope
// you would have to pass it explicitly as second parameter list:
functionRequiringImplicit(0)(SomeImplicitInformation(0,0,0))

// instead you can declare an implicit somewhere in your scope:
implicit val imp = SomeImplicitInformation(0,0,0)

// and now you can call:
functionRequiringImplicit(0)

您得到的错误只是说anorm.Column[Float] 不在隐含的范围内。您可以通过将其隐式添加到您的范围或显式传递来解决它。

为您提供更详细的说明:由于 Column 伴随对象仅提供 rowToDouble 的隐式,您只需使用 the code that is linked in your question。为了让它工作,把它放在你的结果计算之前。稍后您可能希望将其放在某个封闭范围内的 val 中。

【讨论】:

    【解决方案2】:

    试试这个...

    def getInformation(id: Long): List[(Float, Float, Float)] = {
        DB.withConnection { implicit con =>
          val query = SQL("select principal,interest,value from myTable where userId={id} and status=true").on("id"->id)
          val result = query().map { row =>
            Tuple3(row[Float]("principal").asInstanceOf[Float], row[Float]("inetrest").asInstanceOf[Float], row[Float]("value").asInstanceOf[Float])
          }.toList
          return result
        }
      }
    
    implicit def rowToFloat: Column[Float] = Column.nonNull { (value, meta) =>
    val MetaDataItem(qualified, nullable, clazz) = meta
    value match {
      case d: Float => Right(d)
      case _ => Left(TypeDoesNotMatch("Cannot convert " + value + ":" + value.asInstanceOf[AnyRef].getClass + " to Float for column " + qualified))
    }
    }
    

    【讨论】:

      【解决方案3】:

      有些函数可以接受我们所说的隐式参数。在某些条件下,这些参数可以从上下文中导出。如果找不到这些参数,则必须手动指定它们。如果您希望将参数用作隐式参数,则必须将其声明为隐式,例如这样:

      implicit val myVal = ...
      

      它可以在当前块或封闭块中完成(例如,在类主体中,甚至有时在导入中)

      您收到的错误似乎与此功能有关。您正在使用一个需要 anorm.Column[Float] 类型参数的函数。该参数被定义为隐式,以便可以使用隐式值并且您的代码可能更简洁。不幸的是,您的代码中似乎没有这样的隐含值,所以它失败了。

      【讨论】:

      • implicit val queryand implicit val result 但同样的错误发生
      • @LOL:不,你需要implicit val nameDoesNotPlayARole: anorm.Column[Float] = ...——现在把它放在你的result计算之前。
      【解决方案4】:

      最新的 Anorm(包含在 Play 2.3 中)提供了更多的数字转换(详情请参阅 http://applicius-en.tumblr.com/post/87829484643/anorm-whats-new-play-2-3 和 Play 迁移说明)。

      如果您缺少转换器,您可以在 Play github 项目上添加问题。

      最好的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-02
        • 2016-01-17
        • 2011-10-17
        • 2016-03-31
        • 2015-01-27
        • 1970-01-01
        • 2016-02-27
        • 2016-02-22
        相关资源
        最近更新 更多