让我们说我想编写泛型函数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 =>
^
让它运作的最佳方法是什么?
答案 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。