3
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
需要:me.prettyprint.hector.api.Serializer[Any] 注意:Long <: Any(和 me.prettyprint.cassandra.serializers.LongSerializer <: me.prettyprint.cassandra. serializers.AbstractSerializer[Long]),但 Java 定义的 trait Serializer 在类型 T 中是不变的。您可能希望研究通配符类型,例如_ <: Any. (SLS 3.2.10) User.scala /winoria/app/models 第 22 行 Scala 问题

告诉我解决方案。

4

1 回答 1

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 cannot be cast to long”的原因。

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()
于 2013-10-22T15:52:14.140 回答