我编写了一个泛型函数来从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]
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,因此这不是问题.