从Scala调用java通配符泛型方法

时间:2014-05-08 18:34:08

标签: scala

如何从scala调用以下java方法?

public static Config parseMap(Map<String, ? extends Object> values,
        String originDescription) {

我试图按如下方式调用它:

 val SAMPLE_PROPS_MAP : Map[String,AnyRef] = Map("hiveSaveFreq" -> new java.lang.Long(10L), "aggSeconds" -> new java.lang.Long(3))
 val props = ConfigFactory.parseMap(SAMPLE_PROPS_MAP,"props"))

然而Intellij抱怨道:

   Cannot resolve symbol parseMap

要确保这不是其他问题(例如库的版本不正确):

 val props = ConfigFactory.parseMap(null,"props"))

工作正常。此外,智能感知气泡确实将签名确认为如上所示(具有地图)。

然而Intellij抱怨道:

那么Scala相当于的是什么? extends Object

2 个答案:

答案 0 :(得分:0)

需要将Map转换为java格式,如下所示:

import collection.JavaConversions._
val props = ConfigFactory.parseMap(mapAsJavaMap(SAMPLE_PROPS_MAP))

答案 1 :(得分:0)

问题不在上?扩展Object 类型边界声明,而不是Map定义。您拥有的签名是: public static Config parseMap(**java.util.Map**<String, ? extends Object> values, String originDescription) 而你传递的是scala.collection.immutable.Map

您需要将scala地图转换为java地图,方法是“手动”创建Java地图或使用scala API中的工具:

import scala.collection.JavaConverters._
val SamplePropsMap : Map[String,AnyRef] = Map("hiveSaveFreq" -> new java.lang.Long(10L), "aggSeconds" -> new java.lang.Long(3))
val props = ConfigFactory.parseMap(SamplePropsMap.asJava,"props"))

(注意:JavaConverters中的隐式方法是使用javaCollection.asScalascalaCollection.asJava处理java-scala转换的推荐方法。另请注意,在Scala中,'常量'的约定是以资本开头的骆驼案例,例如CamelCase)