如何在scala中使用LongSerializer与hector?

Jag*_*put 3 scala cassandra hector

val mutator=HFactory.createMutator(keyspace,StringSerializer.get())
mutator.addInsertion("rahul", "user", HFactory.createColumn("birth_year", 1990,   
StringSerializer.get(), LongSerializer.get()))//error in LongSerializer.get() as  
mutator.execute()
Run Code Online (Sandbox Code Playgroud)

我正在使用上面的LongSerializer,我收到以下错误.描述资源路径位置类型不匹配; 发现:me.prettyprint.cassandra.serializers.LongSerializer
required:me.prettyprint.hector.api.Serializer [Any]注意:Long <:Any(和me.prettyprint.cassandra.serializers.LongSerializer <:me.prettyprint.cassandra. serializers.AbstractSerializer [Long]),但Java定义的特征序列化程序在类型T中是不变的.您可能希望调查通配符类型,例如_ <: Any.(SLS 3.2.10)User.scala/winoria/app/models第22行Scala问题

告诉我解决方案.

Lex*_*Lex 5

这里发生了一些事情.

首先,Java不允许原始类型作为泛型,因此Hector的LongSerializer是一个AbstractSerializer [java.lang.Long].但是你在Scala工作,所以你需要一个AbstractSerializer [scala.Long].根据具体情况,Scala的Long可以是原始long或java.lang.Long.好消息是Scala非常聪明,可以确定使用什么以及何时使用.你需要的是一个小类型强制:LongSerializer.get().asInstanceOf [Serializer [Long]]

另一个嫌疑人是你需要me.prettyprint.hector.api.Serializer [Any].它看起来像你在调用你的方法是缺乏正确的类型声明.周围代码的示例将有助于进一步诊断.

编辑:感谢您发布周围的代码.看起来你有类型的分歧.createColumn [N,V]被推断为createColumn [String,Int],因为您提供的1990参数是Int.这将转换为java.lang.Int,它是一个类,并且没有类似基元的类型转换.这就是为什么你得到错误"int不能被转换为长"的原因.

val mutator = HFactory.createMutator(keyspace, StringSerializer.get)
mutator.addInsertion(
  "rahul", "user",
  HFactory.createColumn( // Either do: HFactory.createColumn[String, Long]
    "birth_year", 1990L, // Or make sure the type is inferred as Long
    StringSerializer.get,
    // Coerce serializer to scala.Long
    LongSerializer.get.asInstanceOf[Serializer[Long]]))
mutator.execute()
Run Code Online (Sandbox Code Playgroud)