模式匹配和(ereased)泛型函数类型参数

时间:2014-10-06 12:13:25

标签: scala generics pattern-matching type-erasure

让我们说我想编写泛型函数foo,它将使用模式匹配来检查传递的参数是否是它的泛型参数类型T

天真的尝试:

  def foo[T]: PartialFunction[Any, Boolean] = {
    case x: T =>
      true
    case _ =>
      false
  }

...自T获得启用后无效。 Compiller警告确认:

Warning:(11, 13) abstract type pattern T is unchecked since it is eliminated by erasure
    case x: T =>
            ^

让它运作的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

Scala为此目的引入了ClassTag。它们可以通过隐式参数获得,并将自动提供,这意味着您在调用方法时不必担心参数:

import scala.reflect.ClassTag

def foo[T](implicit tag: ClassTag[T]): PartialFunction[Any, Boolean] = {
  case x: T =>
    true
  case _ =>
    false
}

val isString = foo[String] // ClassTag gets provided implicitly here

isString("Hallo") // will return true
isString(42) // will return false

有关详细说明,请参阅docs