通用函数中的Scala模式匹配错误

时间:2015-08-17 08:54:50

标签: scala generics

我编写了一个泛型函数来从HashMap [String,AnyVal]中获取值。此方法从名称返回一个值,但也具有确保它具有特定类型的功能:

class Context {
  private var variables = HashMap[String, Any] ()

  def getVariable (name: String):Any = variables(name)
  def setVariable (name: String, value: Any) = variables += ((name, value))

  def getVariableOfType[T <: AnyVal] (name:String):T ={
    val v = variables(name)
    v match {
      case T => v.asInstanceOf[T]
      case _ => null.asInstanceOf[T]
    }
  }

}

函数getVariableOfType [T&lt ;: AnyVal]将无法编译,因为它在行T => v.asInstanceOf[T]

中显示“无法解析符号T”

1 个答案:

答案 0 :(得分:6)

由于擦除,简单地让case x: T => v.asInstanceOf[T]匹配任何类型。要真正进行类型检查,您必须为ClassTag提供T[T <: AnyVal : ClassTag]

以下是getVariableOfType的工作定义:

import scala.reflect.ClassTag

def getVariableOfType[T <: AnyVal : ClassTag] (name:String):T ={
  val v = variables(name)
  v match {
    case x: T => x
    case _ => null.asInstanceOf[T]
  }
}

缺点是ClassTag并未完全消除擦除问题。因此,请求例如Seq[Int],实际上将匹配每种类型的序列(Seq[Double]Seq[String]等)。在您的示例中,TAnyVal的子类型,因此这不是问题。