如何在scala中使用LongSerializer与hector?

时间:2013-10-20 12:06:19

标签: 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()

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

告诉我解决方案。

1 个答案:

答案 0 :(得分:5)

这里发生了一些事情。

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

另一个嫌疑人是你需要我.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()