2015-09-26 70 views
0

可以匹配特性而不是類的層次結構嗎? 性狀可以匹配嗎?特徵層次結構可以在scala中匹配嗎?

是我在寫作的提取非常inadept,或者是有沒有辦法通過特質,而不是通過類如下面的簡化的例子的意圖相匹配:

abstract trait Abstract 
trait A extends Abstract 
trait B extends Abstract 

class C1 extends A 
class C2 extends A 
class C3 extends B 
class C4 extends B 

object NoCompile{ 
    def foo(s: Abstract) = s match { 
    case A => 
    case B => 
    } 
} 

[error] not found: value A 
[error]  case A => 
[error]  ^
[error] not found: value B 
[error]  case B => 

讓我想起了一個小的結構打字。

+0

你的比賽正在尋找的特質同伴對象 - 這是不存在的。 –

+0

聽起來像你應該開一個新的問題? (你想讓它看起來像什麼?你想用它做什麼?) –

回答

3

只是

object Compile { 
    def foo(s: Abstract) = s match { 
    case _ : A => 
    case _ : B => 
    } 
} 

,因此它可以通過類型匹配,包括類和性狀:

object Compile { 
    def foo(s: Abstract) = s match { 
    case _ : A => 
    case _ : B => 
    case _ : C1 => 
    } 
} 

_只是一個佔位符在這裏,你可以使用任何名稱捕獲對象本身。 知道它不會爲結構類型正常工作,因爲它會永遠成功匹配他們:

scala> object Compile { 
    |  def foo(s: Abstract) = s match { 
    |   case _ : A => 
    |   case _ : B => 
    |   case _ : C => 
    |   case _ : {def a: Int} => println("Z") 
    |  } 
    |  } 
<console>:16: warning: a pattern match on a refinement type is unchecked 
       case _ : {def a: Int} => println("Z") 
         ^

scala> Compile.foo(new Abstract{}) 
Z 
相關問題