соответствующие типы в Scala - PullRequest
19 голосов
/ 16 марта 2011

Можно ли сопоставлять типы в 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!"
  }

(но это компилируется, очевидно:))

Или, возможно, правильный подход - это перегрузка типа ... это возможно?

Я не могу пройтиэто, к сожалению, экземпляр объекта и сопоставления с образцом.

Ответы [ 3 ]

23 голосов
/ 16 марта 2011
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!"
}
21 голосов
/ 16 марта 2011

Вы можете использовать манифесты и сопоставлять их с шаблоном.Случай передачи класса массива проблематичен, так как 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!"
}
6 голосов
/ 12 октября 2017

Manifest идентификатор устарел. Но вы можете использовать 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!"
  }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...