上遞歸類型失敗我有以下示例代碼: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兼容的方式重寫?