Соответствующие типы в scala
Можно ли сопоставлять типы в Scala? Что-то вроде этого:
def apply[T] = T match {
case String => "you gave me a String",
case Array => "you gave me an Array"
case _ => "I don't know what type that is!"
}
(Но это компилируется, очевидно:))
Или, может быть, правильный подход - перегрузка типов... это возможно?
Я не могу передать ему экземпляр соответствия объекта и шаблона, к сожалению.
Ответы
Ответ 1
Вы можете использовать манифесты и сопоставлять их с шаблоном. Случай при передаче класса массива проблематичен, хотя, поскольку JVM использует для каждого типа массива другой класс. Чтобы обойти эту проблему, вы можете проверить, будет ли тип, о котором идет речь, удалить класс массива:
val StringManifest = manifest[String]
def apply[T : Manifest] = manifest[T] match {
case StringManifest => "you gave me a String"
case x if x.erasure.isArray => "you gave me an Array"
case _ => "I don't know what type that is!"
}
Ответ 2
def apply[T](t: T) = t match {
case _: String => "you gave me a String"
case _: Array[_] => "you gave me an Array"
case _ => "I don't know what type that is!"
}
Ответ 3
Manifest
id устарел. Но вы можете использовать TypeTag
import scala.reflect.runtime.universe._
def fn[R](r: R)(implicit tag: TypeTag[R]) {
typeOf(tag) match {
case t if t =:= typeOf[String] => "you gave me a String"
case t if t =:= typeOf[Array[_]] => "you gave me an Array"
case _ => "I don't know what type that is!"
}
}
Надеюсь, что это поможет.