2016-05-20 2 views
0

Получаем следующую ошибку для приведенного ниже кода. Любые идеи очень ценятся. Не совсем уверен, что вызывает это, поскольку у меня есть достаточно других пользовательских типов во всем приложении, которые не вызвали такого поведения.Scala Type Variances Ошибка с сериализатором JSON в phantom-dsl с json4s

Дайте мне знать, если вам нужна дополнительная информация, чтобы иметь возможность предложить рекомендации/предложения.

[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) 
    } 
} 
+1

Что JSON Lib вы используете? пожалуйста, поделитесь импортом –

+0

В более поздних версиях фантома вам больше не нужно указывать три аргумента в 'JsonListColumn', должно быть достаточно. Даже если это не так, то, что вам не хватает, заключается в том, что вам нужно поставить 'ConcreteVinsModel' внутри' JsonListColumn' – flavian

ответ

0

Эта линия:

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

должен быть

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