通过Scala中的擦除消除了返回类型

时间:2016-02-29 13:47:02

标签: scala

考虑以下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")

如何摆脱此警告消息?

提前感谢您的帮助!

1 个答案:

答案 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类型所需的元数据别的什么。