У меня есть функция форматирования строк fmt(v:Any): String
, которая должна выполнять разные вещи в зависимости от типа времени выполнения v
. Так что это выглядит примерно так:Определить, что Any на самом деле является значением scala перечисления
def fmt(v:Any): String = {
v match {
case a: Int => "Int: " + a
case a: String => "\"" + a + "\""
case a => throw new IllegalArgumentException(s"??? '$a', ${a.getClass.getCanonicalName}?!")
}
}
Это бросает IllegalArgumentException("??? 'myVal', scala.Enumeration.Val?!")
, когда я прохожу в значение перечисления Scala. Однако добавление
case a: scala.Enumeration.Val => "Hello enum"
не компилируется: объект Перечень не является членом пакета Скале Примечание: класс Перечень существует, но это не имеет никакого объекта компаньона.
Как я могу обнаружить, что экземпляр, переданный в, является значением перечисления scala?
if (a.getClass.getCanonicalName == "scala.Enumeration.Val")
должен работать, но чувствует себя довольно взломанным - есть ли фактически типизированные шаблоны, которые я могу сделать вместо этого?