2017-10-10 53 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这里没有必要的,因为其他的答案做的,是不好的风格:如果你以后更改类型,在需要改变你的代码编译器不能告诉你。

相关问题