首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala:避免类型擦除

Scala:避免类型擦除
EN

Stack Overflow用户
提问于 2019-10-17 23:09:50
回答 1查看 85关注 0票数 0

来自以下代码:

代码语言:javascript
复制
type Structure = Map[String, Any]

def getStructureSourceNames(structuresDesc: Structure): Iterable[String] = {
  val subColsDesc: Map[String, String] =
    structuresDesc.filter(_._2.isInstanceOf[String]).asInstanceOf[Map[String, String]]
  val subStructuresDesc: Map[String, Structure] = structuresDesc
    .filter(_._2.isInstanceOf[Map[String, Structure]])
    .asInstanceOf[Map[String, Structure]]

  subColsDesc.values ++ subStructuresDesc.values.flatMap(getStructureSourceNames(_))
}

我想传递(String -> String),ia的递归映射。结构的一个例子是:

代码语言:javascript
复制
Map("test" -> Map(
        "newid" -> "id",
        "newstring" -> "string",
        "toto" -> Map("newdouble" -> "double")
      ),
      "otherid" -> "id")

方法getStructureSourceNames应该返回“最终”值的列表ia。浏览整个树,并为每个叶子获取字符串值。

当我运行这段代码时,这会驱使我:

代码语言:javascript
复制
Warning:(78, 32) non-variable type argument String in type scala.collection.immutable.Map[String,Structure] (the underlying of Map[String,Structure]) is unchecked since it is eliminated by erasure
  .filter(_._2.isInstanceOf[Map[String, Structure]])

此外,我不喜欢使用isInstanceOf / asInstanceOf。通过谷歌搜索,我发现我可以使用模式匹配来检查类型,并获得预期的类型映射,但我找不到如何做到这一点。

你会有这样的代码的例子吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-17 23:38:24

有两种模式匹配:

1) sealed trait上的模式匹配(好)

2)模式匹配,其中模式涉及与任意类和相等性检查的匹配(不比instanceOf检查更好)

为了避免2),你需要让你想要匹配的类型匹配一个密封的特征:

代码语言:javascript
复制
sealed trait ConfigValue
case class StringValue(v: String) extends ConfigValue
case class MapValue(map: Map[String, ConfigValue]) extends ConfigValue

val struct: ConfigValue = MapValue(Map("key1" -> StringValue("v1"),
                   "key2" -> MapValue(Map("sub" -> StringValue("val")))))

def allValues(s: ConfigValue): Iterable[String] = {
  s match {
    case StringValue(v) => Seq(v)
    case MapValue(map) => map.values.flatMap(v => allValues(v))
  }
}

println(allValues(struct))

顺便说一下,您的结构看起来类似于json。也许你可以重用一些json库。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58435734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档