在scala中覆盖java公共成员

时间:2016-06-08 09:36:23

标签: scala inheritance

从具有公共成员的Java类继承时,使用scala的override修饰符会引发编译错误,如下所示:

Error:(67, 22) overriding variable userId in class Logon of type String;
 value userId has incompatible type
        override val userId = s.user
                     ^

java类看起来像以下几行:

public class Logon {
  public String userId = "";
}

和scala代码:

class MyLogon extends Logon {
  override val userId : String = "abc"
}

删除修饰符会导致:

Error:(72, 7) overriding variable userId in class Logon of type String;
 value userId needs `override' modifier
  val userId: String = s.user
      ^

为什么是这个?这是一个错误吗?有相关的问题,例如16607517但这些似乎正在改变田野的可见度;情况并非如此 - 他们都是公开的。

相信这是scalac-2.10.4。

2 个答案:

答案 0 :(得分:0)

由于它在Scala中的实现方式,无法覆盖Java中定义的公共字段

公共字段(val user: String)在内部表示为私有字段(例如,private val user$1: String)和公共访问方法(def user: String = user$1)的组合。不允许使用方法覆盖字段,从而导致编译错误。

目前无法在Scala中省略公共访问器方法生成,因此您必须找到其他方法来实现您想要的功能 - 通过定义公共trait或{{1} },或者使用其他字段名称,或者将Java interface包装到具有适当超类构造的Scala Logon中。

Scala与Java的互操作性非常好,但不幸的是,互操作并不完美。

答案 1 :(得分:0)

您无法覆盖成员变量。

这不应与scala允许覆盖val& var,因为scala编译器为它们生成getter和setter方法。