泛型函数中的Scala模式匹配错误
我已经编写了一个泛型函数来从HashMap[String,AnyVal]获取一个值。此方法从名称返回一个值,但还具有一项功能,可确保该值属于特定类型:泛型函数中的Scala模式匹配错误,scala,generics,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) = varia
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]
}
}
}
类上下文{
private var variables=HashMap[String,Any]()
def getVariable(名称:字符串):Any=变量(名称)
def setVariable(名称:字符串,值:任意)=变量+=((名称,值))
def getVariableOfType[T v.asInstanceOf[T]
大小写=null.asInstanceOf[T]
}
}
}
函数getVariableOfType[tV.asInstanceOf[T]只需使用
案例x:T=>v.asInstanceOf[T]
就可以匹配任何类型,因为会被擦除。要真正进行类型检查,必须为T
设置一个类标记
:[T null.asInstanceOf[T]
}
}
缺点是,
ClassTag
并不能完全消除擦除问题。因此,请求例如Seq[Int]
,实际上会匹配每种类型的序列(Seq[Double]
,Seq[String]
,等等)。在您的示例中,T
是AnyVal
的子类型,因此这不会成为问题。要使其编译,您可能是指:case something:T=>v.asInstanceOf[T]/*或者更好的是:something*/
。虽然不推荐使用s.@GáborBakos,我正在尝试按类型进行匹配,但我会尝试这样做。在这种情况下,您肯定应该使用类型标记。否则,由于擦除的原因,它将始终在第一个情况下使用。
。除了@Gábor所说的之外,这也是您的解决方案不起作用的原因k、 编译器错误是因为您的匹配错误。它应该是:v match{case\u:T=>v.asInstanceOf[T]}
,否则编译器会尝试将v
匹配到名为T
的已定义值。解释类型标记的效果甚至比官方文档更好。
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]
}
}