9
scala> class A 
defined class A 

scala> class B 
defined class B 

scala> val a: A = new A 
a: A = [email protected] 

scala> a match { 
    | case _: B => println("unlikely") 
    | case _ => println("no match") 
    | } 
no match 

在上面的例子中不應該編譯器告訴我,其中一個案例永遠不能匹配?最近一個稍微複雜一些的例子讓我意識到了這一點,導致了一種本應該被編譯器捕獲到的不必要的錯誤。在斯卡拉匹配更好的類型檢查

編輯:

只要是關於這個問題更清楚。由於某些原因,我無法看到Scala是不可能的? (我可以理解這些類型是否使用泛型,類型擦除導致了問題,但是這看起來非常簡單。)如果這不是不可能的,那麼Scala中沒有合法的原因嗎?如果不是什麼時候它會被添加? ;)

回答

22

目前,全面性和冗餘校驗僅爲案例類的構造函數的模式來完成。原則上,編譯器也可以爲其他類型的模式執行此操作。但是它必須在SLS中指定完成了哪些測試。考慮到不同模式類之間的相互作用,這看起來可行但不平凡。因此,總而言之,這是Scala中可以從進一步貢獻中獲益的領域之一。

+3

令人驚歎!我從那個教我scala的人那裏得到我的答案,並且也放棄了它! Thx stackoverflow! – Kami 2010-08-03 22:46:36

4

編譯器會警告你(其實編譯失敗)如果你使用的情況下類:

scala> case class A() 
defined class A 

scala> case class B() 
defined class B 

scala> val a = A() 
a: A = A() 

scala> a match { 
    | case A() => println("A") 
    | case B() => println("B") 
    | case _ => println("_") 
    | } 
<console>:13: error: constructor cannot be instantiated to expected type; 
found : B 
required: A 
     case B() => println("B") 
+0

不幸的是,case類有一些限制,並不總是合適的。我看不出爲什麼編譯器不能爲普通的類找出這個問題。 – Dave 2010-08-02 14:49:58