case соответствует `reflect.runtime.universe.Type`

В Java мы можем сделать switch(value) {case(x): // do something;}

В Scala мы можем сделать что-то подобное с выражениями с учетом регистра:

val a = 1
a match {
  case 1 => 1
  case 2 => 2
} // 1

Однако он не работает со значением типа reflect.runtime.universe.Type.

val tpe = typeOf[Int]
tpe match {
  case typeOf[Int] => 1
  case typeOf[Option[Any]] => 2
}
error: not found: type typeOf
case typeOf[Int] => 1
            ^

Вместо этого я должен сделать это:

if (tpe =:= typeOf[Int]) {...}
else if (tpe =:= Option[Any]) {...}

Есть ли возможность использовать здесь выражение case match?


person Yik San Chan    schedule 21.09.2018    source источник


Ответы (1)


Вы можете сделать это (хотя я не уверен, почему вы хотите):

val tpe = typeOf[Int]

val intType = typeOf[Int]
val optionAnyType = typeOf[Option[Any]]

tpe match {
    case `intType` => 1
    case `optionAnyType` => 2
} //1
person Lasf    schedule 21.09.2018
comment
Что делать, если я хочу сопоставить диапазон? например, if (tpe <:< typeOf[Seq[Any]]) {...} else if (tpe <:< Option[Any]) {...} else {...} - person Yik San Chan; 22.09.2018
comment
@YikSanChan Тогда вам нужно сделать это: tpe match { case i if i <:< typeOf[Seq[Any]] => ...; case j if j <:< typeOf[Option[Any]] => ...; case _ => ... } - person Lasf; 23.09.2018