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<:
me.prettyprint.cassandra.serializers.AbstractSerializer [Long]),但Java定义的特性
序列化程序在类型T中是不变的。您可能希望调查通配符类型,例如_
<: Any
。 (SLS 3.2.10)User.scala / winoria / app / models第22行Scala问题
告诉我解决方案。
答案 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()