当从具有公共成员的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 中的公共访问器方法生成,因此您必须找到其他方法来实现您想要的内容 - 通过定义公共trait
或interface
,或使用另一个字段名称,或者通过将 Java Logon
包装到具有适当超类构造的 Scala Logon
中。
Scala与Java的互操作非常好,但不幸的是,互操作并不完美。
不能覆盖成员变量。
这不应该与scala如何允许覆盖val
和var
混淆,因为scala编译器为它们生成getter和setter方法。