我编写了一个泛型函数来从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]
答案 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]
等)。在您的示例中,T
是AnyVal
的子类型,因此这不是问题。