如何在Scala中压制“匹配可能不是详尽无遗”的警告?

时间:2017-03-01 08:07:14

标签: scala

我目前正在实现一个内部使用的小工具,它将一组Excel文件中的数据导入我们的应用程序。根据Excel单元格的类型,我决定如何处理数据。 Excel文件只能包含字符串,数字和布尔单元格,如果遇到任何其他单元格,程序可以在运行时自由崩溃。

现在Scala正确警告我,细胞类型的匹配并不详尽,细胞可以有空白,公式,错误的类型......

有没有办法如何抑制警告,除了明显的警告?:

t match {
  case STRING => ???
  case NUMERIC => ???
  case BOOLEAN => ???
  case _ => throw new MatchError() // redundant, just to suppress the compile time warning
}

2 个答案:

答案 0 :(得分:11)

您可以使用unchecked注释:

(t: @unchecked) match {
  case STRING => ???
  case NUMERIC => ???
  case BOOLEAN => ???
}

正如其他人所提到的,你应该避免使用它,而是相应地选择你的类型以避免这种警告(例如通过使用密封的特征)。但是,如果您发现自己无法这样做,并且您有某种不变量可以保证您的类型始终是给定类型之一,那么使用@unchecked可以解决您的问题。

答案 1 :(得分:2)

不建议这样做(通常情况下),但如果确实需要,请使用PartialFuncion

sealed trait Trait
case object A extends Trait
case object B extends Trait


scala>   def f(x: Trait) = x match {
 |     case A => println("A")
 |   }
<console>:13: warning: match may not be exhaustive.
It would fail on the following input: B
         def f(x: Trait) = x match {
                           ^
f: (x: Trait)Unit


scala> val f: PartialFunction[Trait, Unit] = {
 |     case A => println("A")
 |   }
f: PartialFunction[Trait,Unit] = <function1>

scala> f(A)
A

scala> f(B)
scala.MatchError: B (of class B$)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:254)
  at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:252)
  at $anonfun$1.applyOrElse(<console>:14)
  at $anonfun$1.applyOrElse(<console>:13)
  at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:34)
  ... 29 elided

部分函数的缺点是它们会产生运行时异常的风险。但它们比@unchecked方法更安全(应该在极端情况下使用) - 至少用户可以从类型本身看到潜在的异常。

在您的情况下,我建议您使用Option并将效果与逻辑分开:

  def f(x: Trait) = x match {
    case A => Some("A")
    case _ => None
  }

  def effect(x: Option[String]) = x.foreach(println) //you can use getOrElse(throw RuntimeException) here

  def run(x: Trait) = effect(f(x))

scala> run(A)
A

scala> run(B)