我的目标是使用特性混合来增强内部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