Можем ли мы использовать match для проверки типа класса

Я новичок в scala и сейчас изучаю ключевое слово match.

Я хочу знать, можем ли мы использовать ключевое слово match для проверки типа класса. Мой код:

object Main {
    def main(args: Array[String]) {
        val x = "AA"
        checkType(x)
    }

    def checkType(cls: AnyRef) {
        cls match {
            case String => println("is a String")
            case Date => println("is a Date")
            case _ => println("others")
        }
    }
}

Код не может быть скомпилирован, значит, это невозможно сделать? Как scala-способ проверить тип класса? Это:

if(cls.isInstanceOf[String]) { ... }
else if(cls.isInstanceOf[Date]) { ... }
else { ... }

Верно?


person Freewind    schedule 03.03.2011    source источник


Ответы (2)


Однако это будет скомпилировано:

def checkType(cls: AnyRef) {                    
  cls match {                                 
    case s: String => println("is a String")
    case d: Date => println("is a Date")    
    case _ => println("others")             
  }                                                   
}

... или упрощенная версия этого:

def checkType(cls: AnyRef) =
  cls match {                                 
    case _: String => println("is a String")
    case _: Date => println("is a Date")    
    case _ => println("others")             
  }                                                   
person Wilfred Springer    schedule 03.03.2011
comment
или, даже проще: поскольку match возвращает значение, нужно поместить println(...) вокруг него, чтобы регистры разрешались в соответствующие строки. - person Carl; 09.05.2013

Вам нужен идентификатор перед аннотацией типа в операторе case.

Попробуйте это, и это должно сработать:

object Main {
    def main(args: Array[String]) {
        val x = "AA"
        checkType(x)
    }

    def checkType(cls: AnyRef) {
        cls match {
            case x: String => println("is a String:"+ x)
            case x: Date => println("is a Date:" + x)
            case _ => println("others")
        }
    }
}
person Brian Hsu    schedule 03.03.2011
comment
Мне нравится этот ответ, так как невозможно что-либо сделать с проверенным значением внутри предложений case (в этом фрагменте «cls»), если только ему не присвоено имя, отличное от специального _. Во многих случаях вы захотите принять меры к объекту в зависимости от его типа, и этот ответ хорошо подходит для этого варианта использования. Насколько это важно... - person matanster; 27.03.2013