在scala中匹配类型

Aar*_*ken 20 types 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!"
  }
Run Code Online (Sandbox Code Playgroud)

(但那编译,显然:))

或许正确的方法是类型重载......这可能吗?

遗憾的是,我无法传递一个对象和模式匹配的实例.

Itt*_*ayD 24

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!"
}
Run Code Online (Sandbox Code Playgroud)

  • 我的意思是我需要在没有对象实例的情况下调用它,例如`apply [String]`,而不是`apply("string")`. (5认同)
  • 要传递对象的实例,请使用变量名称替换冒号前的下划线.例如:`case s:String =>"你给了我字符串"+ s` (3认同)

Mor*_*itz 21

您可以使用清单并对它们进行模式匹配.传递数组类的情况虽然有问题,因为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!"
}
Run Code Online (Sandbox Code Playgroud)

  • 如果擦除足够,"ClassManifest"更快. (3认同)
  • “清单”已被弃用。检查答案:/sf/answers/3269485831/ (2认同)

tha*_*_DG 6

Manifestid已弃用.但你可以使用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!"
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.