Scala 自动绘图和;隐式转换必须比任何引用更具体;错误

Scala 自动绘图和;隐式转换必须比任何引用更具体;错误,scala,Scala,基于这个例子,我正在创建自己的应用程序,将数据保存到cassandra中 我定义了一个数据模型如下 import play.api.libs.json.Json case class Location(lat: Double, long: Double) object Location { implicit def toLocation(lat: Double, long: Double) = Location(lat, long) } case class LocationWithTi

基于这个例子,我正在创建自己的应用程序,将数据保存到cassandra中

我定义了一个数据模型如下

import play.api.libs.json.Json

case class Location(lat: Double, long: Double)
object Location {
  implicit def toLocation(lat: Double, long: Double) = Location(lat, long)
}

case class LocationWithTime(location: Location, time: Long)
object LocationWithTime {
  implicit def toLocationWithTime(location: Location, time: Long) = LocationWithTime(location, time)
}

case class Ping(pingUuid: String, senPhoneNumber: String, recPhoneNumber: Set[String], locationWithTime: LocationWithTime)
object Ping {
  implicit val LocationFormat = Json.format[Location]
  implicit val LocationWithTimeFormat = Json.format[LocationWithTime]
  implicit val PingFormat = Json.format[Ping]
}
不幸的是,应该保存数据的代码:

def insertPing(ping: Ping): Unit =
    session.executeAsync(insertPing.bind(ping.pingUuid, ping.senPhoneNumber, ping.recPhoneNumber,
      ping.locationWithTime.location.lat, ping.locationWithTime.location.long, ping.locationWithTime.time))
不编译并返回错误

Error:(24, 38) the result type of an implicit conversion must be more specific than AnyRef
      ping.locationWithTime.location.lat, ping.locationWithTime.location.long, ping.locationWithTime.time))
                                 ^
扩展AnyVal中的case类。基于此,我猜在我的例子中类似的东西也会起作用,但我不能这样做,因为ValueClass只能有一个参数。
如何解决这个问题?

虽然我不熟悉Cassandra,但我认为您的问题是
bind
接受Java
对象(即
AnyRef
s)和
lat
,是
scala.Double
(即Java
Double
),而不是
AnyRef

您可以通过在
java.lang.Double
中包装您的
scala.Double
来实现这一点

insertPing.bind(ping.pingUuid, ping.senPhoneNumber, ping.recPhoneNumber, new java.lang.Double(ping.locationWithTime.location.lat), new java.lang.Double(ping.locationWithTime.location.long), ping.locationWithTime.time)

您准备好的语句也被称为
insertPing
?您的答案是正确的,但是您忘记了java.lang.Double之前的新语句。因此,它应该是session.executeAsync(insertPing.bind(ping.pingUuid、ping.senPhoneNumber、ping.recPhoneNumber、new java.lang.Double(ping.locationWithTime.location.lat)、new java.lang.Double(ping.locationWithTime.location.long)、new java.lang.long(ping.locationWithTime))
这就是我没有用编译器检查的结果。现在编辑答案。