В scala, как сопоставить шаблон с встроенным выражением? - PullRequest
0 голосов
/ 02 февраля 2020

В scala сопоставление с образцом для класса должно проводиться следующим образом:

    val clz: Class[_] = ???

    clz match {
      case v if clz == classOf[String] =>
        // do something
      case v if clz == classOf[Int] =>
        // do something
      //...
    }

Код шаблона v if clz == действительно избыточен, и я хотел бы удалить его или уменьшенный, поскольку функции типа classOf[String] и classOf[int] могут быть встроены и использоваться как константа. Так как я могу это сделать?

1 Ответ

2 голосов
/ 02 февраля 2020

Существует некоторая поддержка, в основном в отношении типов элементов массива:

scala> import reflect.ClassTag
import reflect.ClassTag

scala> val c: Class[_] = classOf[Int]
c: Class[_] = int

scala> (ClassTag(c): Any) match { case ClassTag.Boolean => "bool" case ClassTag.Int => "int" }
res0: String = int

, но вариант использования заключается в упрощении проверки типов

scala> def f[A: ClassTag] = ("abc": Any) match { case _: A => "A" case _ => "other" }
f: [A](implicit evidence$1: scala.reflect.ClassTag[A])String

scala> f[Int]
res1: String = other

scala> f[String]
res2: String = A

Возможно один аргумент для classTag не похоже на стабильный идентификатор, так как classOf[C], вычисленные в разных загрузчиках классов, не сравниваются равными.

...