【发布时间】: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 上使用get 或getOrElse,但没有找到任何可以编译的东西。一些尝试:
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