2013-09-01 97 views
2

上遞歸類型失敗我有以下示例代碼:Scala的模式匹配在2.10

trait Recurse[T <: Recurse[T]] { 
    def method = "This is a method on recurse" 
} 

class Foo extends Recurse[Foo] { 
    override def toString = "This is a foo" 
} 

object Example { 
    def generate: Recurse[_ /*<: Recurse[_]*/] = new Foo() 
    def main(args: Array[String]) { 
    val foo = generate 
    foo match { 
     case m: Foo => println("match: " + m) 
     case _ => println("baa") 
    } 
    println(foo.method) 
    } 
} 

此代碼編譯和正確運行在2.9.x(輸出爲「一致:這是一個foo」的後跟「這是一個遞歸的方法「),但它不適用於2.10.2。相反,我得到的編譯時錯誤:類型參數[_ $ 1]不符合特質Recurse的類型參數邊界[T <:Recurse [T]]

有趣的是,問題只發生在模式匹配器。如果我刪除匹配塊,代碼編譯和代碼輸出「這是一個遞歸方法」。

更有趣的是,模式匹配仍然無法編譯,即使其中唯一的東西是默認情況!編譯器不會接受具有遞歸存在類型的對象來進行模式匹配。但是,如果明確指定foo的值(「val foo = new Foo()」),或者如果類型參數不是遞歸的,則代碼將在2.10上編譯。

這是怎麼回事?爲什麼這會中斷模式匹配,即使類型參數沒有以任何方式參與匹配?有沒有辦法以2.10兼容的方式重寫?

回答

1

我相信這是Scala編譯器的迴歸。爲什麼不是file it