Моя цель состоит в том, чтобы улучшить внутри scala код существующего Java-класса с использованием сочетания признаков. Например, чтобы добавить метод java.awt.Rectangle.translate(dx, dy) в класс java.awt.geom.Ellipse2D. Для этого я создаю следующий признак:
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
Однако, когда я выполняю приведенный выше script в scala 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
Я подозреваю, что эта ошибка связана с тем, как scala реализует vars - как частное поле и пару методов getter/setter. Я пытаюсь достичь выполнимости? Есть ли другой способ определить поля класса java в признаке, а затем обратиться к ним внутри методов конкретных признаков?
Спасибо заранее Джек Димас