具有泛型参数类型的Scala方法

时间:2017-02-22 14:28:37

标签: scala generics methods

我已经和Scala合作了将近一年,但我偶尔会遇到一段我不太了解的代码。这一次就是这个。我试着查看“带有通用参数类型的scala方法”的文档,但我仍然感到困惑。

def defaultCall[T](featureName : String) (block : => Option[T])(implicit name: String, list:Seq[String]) : Option[T] = 
{
   val value = block match {
     case Some(n) => n match {
        case i : Integer => /*-------Call another method----*/
        case s : String => /*--------Call another method----*/
      }
      case _ => None
 }

使用以下代码调用该方法:

 var exValue = Some(10)
 val intialization = defaultCall[Integer]("StringName"){exValue}

我在上面描述的代码中不理解的是defaultCall方法中的“case”语句。

我看到当exValue有一个值且不为空时,代码按预期工作。但是如果我将exValue更改为None,那么我的代码将进入“case _ = None”条件。我不明白为什么会发生这种情况,因为这里完成的匹配是针对“变量”的,它可能是整数或字符串。

1 个答案:

答案 0 :(得分:4)

这里发生的是当你传递一个None时它将匹配第二个案例,它“捕获”所有不是某个[T]实例的东西:

block match {
  case Some(n) => // Will match when you pass an instance of Some[T]
  case _       => // Will match on any other case
}

请注意,None和Some是从Option继承的两个不同的类。

此外,仅在第一个匹配成功时才执行变量匹配,否则不执行。要在第一场比赛中完成类型检查,您可以这样做:

block match {
  case Some(n: Int)    => // do stuff
  case Some(n: String) => // do stuff
  case _               => // Will match on any other case
}

希望有所帮助