我的目標是使用特性混合來增強內部scala代碼現有的Java類。例如,要向java.awt.geom.Ellipse2D類添加一個像java.awt.Rectangle.translate(dx,dy)這樣的方法。爲此,我創建了以下特點:構建一個橢圓時使用traits增強java類,如何在java字段內部trait中聲明?
trait RectangleLike {
var x: Double // abstract vals to correspond to java class fields
var y: Double // I need these vars to refer to them inside translate method
def translate(dx: Double, dy: Double) {
x = x + dx
y = y + dy
}
// more concrete trait methods here
} // defines without errors in scala REPL
然後使用特點:
val egg = new java.awt.geom.Ellipse2D.Double(5, 10, 20, 30) with RectangleLike
然而,當我執行在斯卡拉REPL上面的腳本中,我得到以下輸出:
<console>:8: error: overriding variable x in trait RectangleLike of type Double;
variable x in class Double of type Double has incompatible type;
other members with override errors are: y
val egg = new java.awt.geom.Ellipse2D.Double(5, 10, 20, 30) with RectangleLike
我懷疑這個錯誤是由於斯卡拉實現變量的方式 - 作爲私有字段和getter/setter方法對。我試圖實現的是什麼?有沒有另外一種方法來定義trait中的java類字段,然後在具體的trait方法中引用它們?
在此先感謝 傑克·迪馬斯
@forNelton令人印象深刻!非常感謝,我真的被困在此。我必須研究隱含的觀點。 – ideathbird 2012-02-07 07:07:35
不客氣。根據您的應用程序的類型,我認爲第一種方法可能更合適,因爲方法調用可能更快,而沒有任何隱含的麻煩。 – fotNelton 2012-02-07 07:58:42