【问题标题】:Getting value from Java raw map从 Java 原始映射中获取价值
【发布时间】:2018-01-09 10:45:10
【问题描述】:

我正在尝试写一个函数

def convert(x: String): String = ...

通过在映射中查找来转换其参数,如果参数不是映射中的键,则返回x。不幸的是,必须通过调用返回原始Map 的Java 方法来获取地图:

public static Map getMapFromConfiguration() { ... }

这是我无能为力的遗留代码。在这种特殊情况下,返回的映射的键和值将是String(如果键或值具有其他类型,则代码抛出异常也没关系)。到目前为止,我能够编译代码的唯一方法是构造一个新的Map[String,String]

def convert(x: String): String = {
    val mapFromConfig: scala.collection.mutable.Map[_,_] = JavaClass.getMapFromConfiguration().asScala
    val convertedMap: Map[String,String] = (mapFromConfig map {
        case (key, value) => key.asInstanceOf[String] -> value.asInstanceOf[String] }).toMap
    convertedMap.getOrElse(x, x)
}

我尝试了各种方法来直接在mapFromConfig 上使用getgetOrElse,但没有找到任何可以编译的东西。一些尝试:

    val mapFromConfig: scala.collection.mutable.Map[_ <: Any, _ <: Any] = JavaClass.getMapFromConfiguration().asScala
    mapFromConfig.getOrElse(x, x).asInstanceOf[String]

Type mismtach, expected: _$1, actual: String

    val mapFromConfig: scala.collection.mutable.Map[Any,Any] = JavaClass.getMapFromConfiguration().asScala
    mapFromConfig.getOrElse(x, x).asInstanceOf[String]

error: type mismatch;
 found   : scala.collection.mutable.Map[?0,?1] where type ?1, type ?0
 required: scala.collection.mutable.Map[Any,Any]
Note: ?0 <: Any, but trait Map is invariant in type A.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)
Note: ?1 <: Any, but trait Map is invariant in type B.
You may wish to investigate a wildcard type such as `_ <: Any`. (SLS 3.2.10)

    val mapFromConfig: java.util.Map[_,_] = JavaClass.getMapFromConfiguration()
    mapFromConfig.getOrDefault(x, x).asInstanceOf[String]

Type mismtach, expected: _$2, actual: String

有没有一种好方法可以在不创建中间地图的情况下完成我的需要?

【问题讨论】:

  • 我认为,如果您删除类型注释,您的最后一次尝试(使用getOrDefault)应该可以工作
  • @Dima 如果您的意思是删除 : java.util.Map[_,_],我会遇到同样的错误。
  • 这太糟糕了。换成java.util.Map[Any, Any]怎么样?
  • @Dima 现在mapFromConfig 出现错误。 java.util.Map[Any,Any] 不符合预期的类型 java.util.Map[_,_]
  • Map[_,_]在哪里?

标签: scala


【解决方案1】:

主要技巧是将非泛型Map 强制转换为显式泛型java.util.Map[String, String]。适合我的代码是

val map: java.util.Map[String, String] = ScalaToJava.getMapFromConfiguration.asInstanceOf[java.util.Map[String, String]]
println(map.get("key"))

给定 Java 代码:

public class ScalaToJava {
    static Map getMapFromConfiguration() {
        HashMap map = new HashMap();
        map.put("key", "value");
        return map;
    }
}

或者,如果您想将 map 转换为 Scala,您可以使用类似

val map = ScalaToJava.getMapFromConfiguration.asInstanceOf[java.util.Map[String, String]].asScala
println(map.get("key"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多