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

Vog*_*ltz 2 generics scala

我编写了一个泛型函数来从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]
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

函数getVariableOfType [T <:AnyVal]将无法编译,因为它在行情况下显示"无法解析符号T" T => v.asInstanceOf[T]

Kol*_*mar 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]
  }
}
Run Code Online (Sandbox Code Playgroud)

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