考虑以下Scala代码段:
def func(param: Any): Int = param match {
case f: (String => Int) => f("apple")
case i: Int => i
}
println(func((s: String) => s.length))
按预期工作,但是,在编译时我收到以下警告:
<console>:11: warning: non-variable type argument String in type pattern String => Int is unchecked since it is eliminated by erasure
case f: (String => Int) => f("apple")
如何摆脱此警告消息?
提前感谢您的帮助!
答案 0 :(得分:4)
您收到消息的原因是Java的通用type erasure。在这种特殊情况下,Function[String, Int]
类型的函数将与任何Function[A, B]
匹配。
为了消除此警告,您应该使用scala typetags,这样您就可以区分不同的函数类型。
下面的代码段
import scala.reflect.runtime.universe._
object Answer {
def function[A](param: A)(implicit tt: TypeTag[A]): String = param match {
case f: (String => Int) @unchecked if typeOf[String => Int] =:= typeOf[A] => f("apple").toString
case f: (Int => String) @unchecked if typeOf[Int => String] =:= typeOf[A] => f(32 + 1)
case s: String => s"hello $s"
}
def main (args: Array[String]) {
println(function((s: String) => s.length))
println(function((i: Int) => i.toString))
println(function("world"))
}
}
关键部分是在编译时添加implicit
TypeTag[A]
,其中包含函数typeOf
检查A
类型所需的元数据别的什么。