2011-03-03 94 views
36

我是新来的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 { ... } 

对不对?

回答

69

然而,这编译:

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")    
    }             
+6

或** **甚至简单:因为比赛得到的值,就是把'调用println(...)'绕过它,案件解决适当的字符串。 – Carl 2013-05-09 19:24:37

10

您需要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") 
     } 
    } 
} 
+1

我喜欢这个答案,因为不可能对case子句中的checked值进行任何操作(在这个片段'cls'中),除非给定的名字不是特殊的_。在很多情况下,你想根据类型对对象采取行动,这个答案很适合用例。尽可能重要...... – matanster 2013-03-27 17:39:55

相关问题