【发布时间】:2017-08-14 03:25:28
【问题描述】:
我正在尝试使用可变数量的参数创建一个函数
def foo(args: String*)
此函数的作用是消除空字符串并用逗号分隔其余字符串 (,)。
def foo(args: String*) = {
args.flatMap {
case str if str.isEmpty => None
case str => Some(str)
}.mkString(", ")
}
当我扩展此函数以支持 Option[String] 参数时
def foo(args: Any*) = {
args.flatMap {
case str: String if str.isEmpty => None
case str: Option[String] if str.getOrElse("").isEmpty => None
case str => Some(str)
}.mkString(", ")
}
我收到一个警告说
警告:类型模式中的非变量类型参数字符串 Option[String] 未选中,因为它被擦除消除了
当我传递参数时
foo("", "Hello", Some(""), Some("what"))
我有错误
scala.MatchError: Some(what) (of class scala.Some) at $anonfun$makeAddress$1.apply(:12) 在 $anonfun$makeAddress$1.apply(:12)
我应该如何创建同样支持Option[String]的函数?
【问题讨论】:
-
我得到了一个可能的解决方案gist.github.com/fahadsiddiqui/b530a093a643f489a9a661606d479f30,但如果有最佳解决方案,请告诉我。
-
使用
Any是一种强烈的代码气味-它是[类型层次结构]的顶部(docs.scala-lang.org/tutorials/tour/unified...)。结果,编译器无法帮助您,即防止运行时错误,因为该类型因其广泛性而无用。
标签: scala