【问题标题】:Overriding java public members in scala覆盖scala中的java公共成员
【发布时间】:2016-06-08 09:36:23
【问题描述】:

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


    【解决方案1】:

    不可能覆盖在 Java 中定义的公共 字段,因为它在 Scala 中是如何实现的:

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

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

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

    【讨论】:

      【解决方案2】:

      您不能覆盖成员变量。

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

      【讨论】:

        猜你喜欢
        • 2022-11-01
        • 2018-05-20
        • 1970-01-01
        • 2017-11-16
        • 2017-08-22
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多