如果有現有的Java類pkg.Test,爲什麼需要類型同義詞來定義在Scala中匹配Java類的patten抽取器?
package pkg;
public class Test {
public int v;
public Test(int v) { this.v = v; }
}
試圖通過定義斯卡拉同伴對象
package pkg
object Test{
def unapply(t : Test) : Option[Int] = Some(t.v)
}
產生的錯誤,使提取器「測試已經被定義爲對象測試」。 然而,一切似乎如果我做了Java類的同義詞在一個新的包
package pkg
package object matchers {
type Test = pkg.Test
}
工作,在新的包
package pkg.matchers
object Test {
def unapply(t : Test) : Option[Int] = Some(t.v)
}
現在定義相應的對象的模式,所有成員都的原始類可從新包中提取
import pkg.matchers._
object main {
def main(args : Array[String]) {
val t = new Test(1)
t match {case Test(v) => println(v)}
println(t.v)
}
}
添加類型同義詞讓這項工作看起來很奇怪。除了必須使用新的軟件包之外,這種方式添加模式匹配還有什麼問題嗎?有什麼方法可以使原始包裝中的提取器可用?
這將如何工作,如果主是不是在或正在PKG?我發現它與pkg的靜態部分沒有衝突。測試很重要,並且提取器實際上不是一個伴隨對象,但是範圍很混亂。將pkg.Test顯式導入到main的開始會產生一個錯誤,即該模式中的「Test」模糊不清,因爲它被導入了兩次,而以某種方式從相同的包中獲取它只是一次。 – Brandon 2013-03-21 06:10:40
只有你的第四個選擇做我想要的 - 讓模式和原始類都可以不合格地訪問。在規範中我沒有看到任何解釋爲什麼導入pkg._應該與顯式導入所有名稱不同,但將行更改爲導入pkg.Test會生成與以前相同的變量。不過,這可能是另一個問題。感謝您的幫助。 – Brandon 2013-03-21 19:31:26