Оператор переключения регистра с объектом класса в Scala - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать оператор переключения регистра в Scala, чтобы проверить, какой класс / тип представляет объект Java Class.Я не могу передать фактический объект, но я могу получить класс, и мне нужно выполнить другую логику в зависимости от этого объекта класса.Например,

def foo(classObj: Class[_]): Any = {
  classObj match {
    case map: Map[String, String] => doMapThings()
    case str: String => doStringThings()
  }
}

Однако на самом деле это не работает, потому что оператор case смотрит на тип Class, который является Class, и никогда не будет Map или String.Как я могу получить тип / класс, который представляет classObj, и сопоставить его вместо этого?

1 Ответ

0 голосов
/ 15 февраля 2019

Почему бы просто не сделать очевидное:

def foo(c: Class[_]): Unit = {
  if (c == classOf[Map[_, _]]) println("do Map things") 
  else if (c == classOf[String]) println("do string things") 
  else println("do sth. else") }
}

Вы можете переписать его как выражение match, используя if -guards:

c match {
  case x if x == classOf[Map[_, _]] => ... 
  ...
}

, но это не таккажется короче или яснее.Также обратите внимание: вы не можете различить Map[Int, Double] и Map[String, String] во время выполнения из-за типа стирания.

...