2011-08-31 197 views
3

什麼可能是錯誤的?hector scala類型不匹配

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

回答

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 ...) 
+0

不幸的是,你的解決方法不起作用。對於這段代碼: 'val a = createColumn(「updateTime」,11,ss,IntegerSerializer.get.asInstanceOf [Serializer [_ <:Any]])' 我得到這個錯誤: 'error:type mismatch ; found:me.prettyprint.hector.api.Serializer [_ $ 2]其中type _ $ 2 必需:me.prettyprint.hector.api.Serializer [Any] 注意:_ $ 2 <:任何,但是由Java定義的trait Serializer在類型T中是不變的。 您可能希望研究通配符類型,例如\'_ <:Any \'。 (SLS 3.2.10) VAL A = createColumn( 「註冊」,11,SS,IntegerSerializer.get.asInstanceOf [串行[_ <:任何]])' – DarkAnthey

+0

啊,對不起,我無法進行測試。如果只是投射到「Serializer [Any]」?我更新了答案。 –

+0

順便說一句,這裏是相關的Java代碼:https://github.com/rantav/hector/blob/master/core/src/main/java/me/prettyprint/cassandra/serializers/IntegerSerializer.java –