我目前正在实现一个内部使用的小工具,它将一组Excel文件中的数据导入我们的应用程序。根据Excel单元格的类型,我决定如何处理数据。 Excel文件只能包含字符串,数字和布尔单元格,如果遇到任何其他单元格,程序可以在运行时自由崩溃。
现在Scala正确警告我,细胞类型的匹配并不详尽,细胞可以有空白,公式,错误的类型......
有没有办法如何抑制警告,除了明显的警告?:
t match {
case STRING => ???
case NUMERIC => ???
case BOOLEAN => ???
case _ => throw new MatchError() // redundant, just to suppress the compile time warning
}
答案 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)