【问题标题】:Scala Type Variances Error with JSON serializer in phantom-dsl with json4s带有json4s的phantom-dsl中JSON序列化程序的Scala类型差异错误
【发布时间】:2016-05-31 21:03:05
【问题描述】:

以下代码出现以下错误。任何见解都非常感谢。不太清楚是什么原因造成的,因为我在整个应用程序中有大量其他用户定义的类型并没有导致这种行为。

如果需要更多信息才能提供指导/建议,请告诉我。

    [error] /Users/dan_mi_sun/projects/openblockchain/src/main/scala/org/dyne/danielsan/openblockchain/data/model/GenericVinModel.scala:35: type mismatch;
    [error]  found   : org.dyne.danielsan.openblockchain.data.model.VinsModel
    [error]  required: com.websudos.phantom.CassandraTable[org.dyne.danielsan.openblockchain.data.model.VinsModel,org.dyne.danielsan.openblockchain.data.entity.Vin]
    [error] Note: org.dyne.danielsan.openblockchain.data.model.ConcreteVinsModel <: org.dyne.danielsan.openblockchain.data.model.VinsModel (and org.dyne.danielsan.openblockchain.data.model.VinsModel <: com.websudos.phantom.CassandraTable[org.dyne.danielsan.openblockchain.data.model.ConcreteVinsModel,org.dyne.danielsan.openblockchain.data.entity.Vin]), but class CassandraTable is invariant in type T.
    [error] You may wish to define T as +T instead. (SLS 4.5)
    [error]   object scriptsig extends JsonListColumn[VinsModel, Vin, ScriptSig](this) {
    [error]                                                                      ^
    [error] one error found

import com.websudos.phantom.CassandraTable
import com.websudos.phantom.dsl._
import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.jackson.Serialization
import org.json4s.jackson.Serialization.write

import scala.concurrent.Future

case class ScriptSig(asm: String,
                     hex: String)

case class Vin(txid: String,
               vout: Int,
               scriptSig: List[ScriptSig],
               sequence: Int)

sealed class VinsModel extends CassandraTable[ConcreteVinsModel, Vin] {

  implicit val formats = Serialization.formats(NoTypeHints)

  override def fromRow(row: Row): Vin = {
    Vin(
      txid(row),
      vout(row),
      scriptSig(row),
      sequence(row)
    )
  }

  object txid extends StringColumn(this)

  object vout extends IntColumn(this)

  object scriptSig extends JsonListColumn[VinsModel, Vin, ScriptSig](this) {
    override def fromJson(obj: String): ScriptSig = {
      parse(obj).extract[ScriptSig]
    }

    override def toJson(obj: ScriptSig): String = {
      write(obj)
    }

  }

  object sequence extends IntColumn(this)
}

abstract class ConcreteVinsModel  extends VinsModel  with RootConnector {

  override val tableName = "vins"

  def insertNew(v: Vin): Future[ResultSet] = insertNewVin(v).future()

  def insertNewVin(v: Vin) = {
    insert
      .value(_.txid, v.txid)
      .value(_.vout, v.vout)
      .value(_.scriptSig, v.scriptSig)
      .value(_.sequence, v.sequence)
  }
}

【问题讨论】:

  • 您使用的是什么 JSON 库?请分享您的进口商品
  • 在最新版本的 phantom 中,您不再需要为 JsonListColumn 提供 3 个参数,一个就足够了。即使这不是真的,您缺少的是您需要将ConcreteVinsModel 放入JsonListColumn

标签: scala json4s phantom-dsl


【解决方案1】:

这一行:

object scriptSig extends JsonListColumn[VinsModel, Vin, ScriptSig](this)

应该是

object scriptSig extends JsonListColumn[ConcreteVinsModel, Vin, ScriptSig](this)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-19
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多