Scala 从映射中检索类型化的存储值

Scala 从映射中检索类型化的存储值,scala,type-erasure,typed,Scala,Type Erasure,Typed,我想将一些数据放入HashMap中,并使用函数作为类型化值检索这些数据。该函数采用预期的类型,并且在值未存储在HashMap中的情况下采用默认值。JVM的类型擦除使得这成为一件棘手的事情 问:如何检索类型化的值 代码和结果如下 abstract class Parameters(val name: String) { val parameters = new HashMap[String, Any]() def put(key: String, value: Any) = parame

我想将一些数据放入HashMap中,并使用函数作为类型化值检索这些数据。该函数采用预期的类型,并且在值未存储在HashMap中的情况下采用默认值。JVM的类型擦除使得这成为一件棘手的事情

问:如何检索类型化的值

代码和结果如下

abstract class Parameters(val name: String) {
  val parameters = new HashMap[String, Any]()

  def put(key: String, value: Any) = parameters(key) = value

  def get(key: String) = parameters.getOrElse(key, None)

  def remove(key: String) = parameters.remove(key)


  def g0[T: TypeTag](key: String, defaultValue: T) = {
    get(key) match {
      case x: T => x
      case None => defaultValue
      case _ => defaultValue
    }
  }


  def g1[T: ClassTag](key: String, defaultValue: T) = {
    val compareClass = implicitly[ClassTag[T]].runtimeClass

    get(key) match {
      case None => defaultValue
      case x if compareClass.isInstance(x) => x.asInstanceOf[T]
    }
  }
}

class P extends Parameters("AParmList") {
  put("1", 1)
  put("3", "three")
  put("4", 4.0)
  put("width", 600)

  println(g0[Int]("width", -1))
  println(g0[Int]("fail", -2))
  println(g1[Int]("width", -3))
  println(g1[Int]("fail", -4))
}


object TypeMatching {
  def main(args: Array[String]) {
    new P
  }
}
输出为(括号中的注释): 600(如预期) 无(预期为-2)
和匹配错误(java.lang.Integer存储,Int必需)

相关:使用
Class
对象会有问题吗?在不能隐藏使用
Class
的地方,它会使语法更加明确,但我认为这会使它更容易:使用
Class
对象会有问题吗?在无法隐藏
Class
用法的地方,它会使语法更加明确,但我认为这会使它更容易