可能出现什么问题?
val is = IntegerSerializer.get
mutator.addInsertion(deviceId, COLUMN_FAMILY_CARSTATUS, createColumn("mileage", 111, ss, is))}
ModelOperation.scala:96: error: type mismatch;
[INFO] found : me.prettyprint.cassandra.serializers.IntegerSerializer
[INFO] required: me.prettyprint.hector.api.Serializer[Any]
[INFO] Note: java.lang.Integer <: Any (and me.prettyprint.cassandra.serializers.IntegerSerializer <: me.prettyprint.cassandra.serializers.AbstractSerializer[java.lang.Integer]), but Java-defined trait Serializer is invariant in type T.
[INFO] You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
[INFO] mutator.addInsertion(deviceId, COLUMN_FAMILY_CARSTATUS, createColumn("mileage", 111, ss, is))}
答案 0 :(得分:6)
该错误表明createColumn
需要类型为Serializer[Any]
的序列化程序,但您传递的是Serializer[Integer]
类型的序列化程序。只有Serializer
在其类型参数中具有协变性(即定义为Serializer[+T]
)时,这才有效。但相反,Serializer
来自Java,其中协方差的工作方式不同。
类型Serializer[Integer]
可以安全地转换为Serializer[_ <: Any]
,因此Scala编译器建议可能应该编写createColumn
以期望不太具体的通配符类型。
如果你不能修改createColumn
,那么最后的办法就是使用“类型系统逃生舱”asInstanceOf
来转换为预期的类型:
val is = IntegerSerializer.get.asInstanceOf[Serializer[Any]] // defeats type system
mutator.addInsertion(... is ...)