несоответствие типа Гектора Скала - PullRequest
3 голосов
/ 31 августа 2011

Что может быть не так?

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))}

1 Ответ

6 голосов
/ 31 августа 2011

Ошибка говорит о том, что createColumn требует сериализатор типа Serializer[Any], но вы передаете один из типа Serializer[Integer]. Это работало бы, только если бы Serializer были ковариантными в своем параметре типа (т.е. определены как Serializer[+T]). Но вместо этого Serializer происходит из Java, где ковариация работает по-другому.

Тип Serializer[Integer] может быть безопасно приведен к Serializer[_ <: Any], поэтому компилятор Scala предполагает, что, возможно, createColumn должен был быть написан так, чтобы ожидать, что вместо этого будет использоваться менее конкретный тип подстановочного знака.

Если вы не можете изменить createColumn, то в крайнем случае используйте «1015 * системный аварийный люк системы типов» для приведения к ожидаемому типу:

val is = IntegerSerializer.get.asInstanceOf[Serializer[Any]] // defeats type system
mutator.addInsertion(... is ...)
...