为什么在scala中不允许覆盖变量

时间:2018-11-08 05:58:58

标签: scala

情况1:覆盖var i以更改可见性

仅当Test1.iTest1Scala.i均为val时才有效,否则会导致编译错误:“变量,我不能覆盖可变变量”。

package test
class Base1 {
  private[test] var i = 0
}
class Child1Scala extends Base1 {
  override var i = 1
}

可以使用Java绕过此限制

class Child1Java extends Base1 {
    @Override public int i() {
        return super.i();
    }
    @Override public void i_$eq(int value) {
        super.i_$eq(value);
    }
}

情况2:覆盖var i以添加一些用于记录的代码

varval都不起作用。它总是会导致编译错误:“ super可能不用于变量i”。但是如果没有super,那里的方法将成为无限的尾部调用

class Base2 {
  var i = 0
}
class Child2Scala extends Base2 {
  override def i: Int = {
    println("get")
    super.i
  }
  override def i_=(value: Int): Unit = {
    println("set")
    super.i = value
  }
}

同样,在Java中是合法的

class Child2Java extends Base2 {
    @Override public int i() {
        System.out.println("get i");
        return super.i();
    }
    @Override public void i_$eq(int value) {
        System.out.println("set i");
        super.i_$eq(value);
    }
}

0 个答案:

没有答案