覆盖 scala 中的 Java 公共成员



当从具有公共成员的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。

由于在

Scala 中的实现方式,不可能覆盖 Java 中定义的公共字段

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

目前没有办法省略 Scala 中的公共访问器方法生成,因此您必须找到其他方法来实现您想要的内容 - 通过定义公共traitinterface,或使用另一个字段名称,或者通过将 Java Logon包装到具有适当超类构造的 Scala Logon中。

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

不能覆盖成员变量。

这不应该与scala如何允许覆盖valvar混淆,因为scala编译器为它们生成getter和setter方法。

最新更新