从具有公共成员的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。
答案 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方法。