2017-10-10 58 views
0

我是新來斯卡拉,當我編譯我的SBT項目,我看到這個異常:強制類型轉換:地圖[字符串,字符串]以地圖[字符串,對象]

[error] C:\dev\reactive-rabbit\src\main\scala\io\scalac\amqp\impl\RabbitConnection.scala:58: type mismatch; 
[error] found : Map[String,String] (in scala.collection.immutable) 
[error] required: Map[String,Object] (in java.util) 
[error]  future(onChannel(_.exchangeBind(destination, source, routingKey, arguments))) 
[error]                 ^

我最近更換過時的JavaConversions庫到JavaConverters。我的代碼看起來是這樣的:

import scala.collection.JavaConvertors._ 
override def exchangeBind(destination: String, source: String, routingKey: String, 
         arguments: Map[String, String]) = 
    future(onChannel(_.exchangeBind(destination, source, routingKey, arguments))) 
     .map(_ ⇒ Exchange.BindOk()) 

我看着合同onChannel()及其arguments參數需要鍵入Map[String, Object](Java集合),但我傳遞一個地圖[字符串,字符串](斯卡拉不變)。如何在將此參數傳遞給方法時更改數據類型?謝謝。

回答

0

使用JavaConverters而不是JavaConversions(不建議使用),也映射字符串對象,以防止出現以下錯誤:

<console>:19: error: type mismatch; 
found : java.util.Map[String,String] 
required: java.util.Map[String,Object] 
Note: String <: Object, but Java-defined trait Map is invariant in type V. 
You may wish to investigate a wildcard type such as `_ <: Object`. (SLS 3.2.10) 
     javaMap = Map[String,String]().asJava 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.JavaConverters._ 

var javaMap: java.util.Map[String,Object] = new java.util.HashMap() 
javaMap.put("key", "value") 

println(javaMap) 

javaMap = Map[String,String]("new_key" -> "new_value").map{case (k,v) => (k, v.asInstanceOf[Object])}.asJava 

// Exiting paste mode, now interpreting. 

{key=value} 
import scala.collection.JavaConverters._ 
javaMap: java.util.Map[String,Object] = {new_key=new_value} 
javaMap: java.util.Map[String,Object] = {new_key=new_value} 

scala> 
+0

使用'map'的轉換實際上並不是必須的,只需要花費時間和內存。 –

1

的Scala Map是在值類型參數協變,因此Map[String, String]已經Map[String, Object],沒有mapmapValues必要的。您可以將其分配到val,並具有所需的類型或使用類型:arguments: Map[String, Object]。然後調用asJava

(arguments: Map[String, Object]).asJava 

注意,使用asInstanceOf這裏沒有必要的,因爲其他的答案做的,是不好的風格:如果你以後更改類型,在需要改變你的代碼編譯器不能告訴你。

相關問題