Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型函数中的Scala模式匹配错误_Scala_Generics - Fatal编程技术网

泛型函数中的Scala模式匹配错误

泛型函数中的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

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

}
类上下文{
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]
  }
}