Соответствующие типы в 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!"
  }
}

Надеюсь, что это поможет.