簡體   English   中英

從Scala調用Java通配符泛型方法

[英]Calling into java wildcard generic method from 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"))

工作正常。 同樣,智能提示氣泡會確認簽名如上所示(具有Map)。

但是Intellij抱怨:

那么,Scala等於什么? 擴展對象

Map需要轉換為java格式,如下所示:

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

問題不在嗎? 擴展了對象類型的邊界聲明,但擴展了Map定義。 您擁有的簽名是: public static Config parseMap(**java.util.Map**<String, ? extends Object> values, String originDescription) ,您正在public static Config parseMap(**java.util.Map**<String, ? extends Object> values, String originDescription)傳遞一個scala.collection.immutable.Map

您需要通過“手動”創建Java映射或使用scala API中的功能將scala映射轉換為Java映射:

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中的隱式方法是推薦的處理java-scala轉換的方法,方法是使用javaCollection.asScalascalaCollection.asJava 。另外請注意,在Scala中,“常量”的約定是駝峰式,以大寫字母開頭例如CamelCase)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM