gpt4 book ai didi

模式匹配 Map[String, Int] 中的 Scala 类型删除

转载 作者:行者123 更新时间:2023-12-04 15:20:58 24 4
gpt4 key购买 nike

Scala 2.10 ,编译器警告给定的代码:

  private def getStrFromOpt[T](opt: Option[T]): String = opt match {
case Some(s: String) => s
case Some(i: Int) => i.toString()
case Some(l: Long) => l.toString()
case Some(m: Map[String, Int]) => m map ({ case (k, v) =>
"(" + k + ", " + v + ")" }) mkString ("(", ", ", ")")
case _ => ""
}

留言 non-variable type argument String in type pattern Map[String,Int] is unchecked since it is eliminated by erasure: case Some(m: Map[String, Int]) ... .

我怎样才能摆脱这个警告?如果我有一个 Map[String, MyObj] 怎么办?我想在这个匹配中作为一个案例包含 - 我如何用参数化 map 区分这两种情况?

最佳答案

您可以使用 Scala 注释 @unchecked 来抑制警告,
对于你的第二个问题,我建议你使用 Scala 反射——TypeTag。我正在使用 Scala 2.11.4,这里是示例代码,仅供引用。

import scala.reflect.runtime.{ universe => ru }
import scala.reflect.runtime.universe.{ typeTag, TypeTag }

object MapType extends App {
def getTypeTag[T: TypeTag](t: T) = typeTag[T].tpe
def getTypeTag[T: TypeTag] = ru.typeOf[T]

// context bound T: ru.TypeTag cause typeOf
// requires implicit parameter
def getStrFromOpt[T: TypeTag](opt: Option[T]): String = {
opt match {
case Some(s: String) => s
case Some(i: Int) => i.toString()
case Some(l: Long) => l.toString()
case Some(m: Map[String, Int] @ unchecked)
if getTypeTag[T] =:= getTypeTag[Map[String, Int]] => "Int Map"
case Some(m: Map[String, String] @ unchecked)
if getTypeTag[T] =:= getTypeTag[Map[String, String]] => "String Map"
case _ => ""
}
}

// "Int Map"
println(getStrFromOpt(Some(Map("a" -> 2, "b" -> 3))))
// "String Map"
println(getStrFromOpt(Some(Map("a" -> "2", "b" -> "3"))))
}

实际上,Scala 和 Java 一样使用泛型的删除模型。所以在运行时不会维护关于类型参数的信息。
def isIntMap(x: Any) = x match {
case m: Map[Int, Int] => true
case _ => false
}

对于上面的代码,Scala 编译器无法判断 m 是否为 Map[Int, Int]。因此, isIntMap(Map("a"-> "b")) return true,这似乎不直观。
为了提醒您运行时行为,Scala 编译器发出了未检查的消息。

但是,Array 是一个 Exception,它的元素类型与元素值一起存储。
def isIntArray(x: Any) = x match {
case a: Array[String] => "yes"
case _ => "no"
}

scala> isIntArray(Array(3))
res1: String = no

scala> isIntArray(Array("1"))
res2: String = yes

关于模式匹配 Map[String, Int] 中的 Scala 类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31470775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com