我有一个Scala特征
trait MyTrait{
val foo: String
def bar = foo
}
以及提供foo的Java类
public class MyJavaClass {
public final String foo = "hello";
}
现在我尝试混合它们
class MyScalaClass extends MyJavaClass with MyTrait {
}
它不会编译
overriding value foo in trait MyTrait of type String; value foo in class MyJavaClass of type java.lang.String has incompatible type.
我已经尝试了vals,vars和defs的所有组合,看似合理,但找不到任何编译此配置的方法 .
如何使用Java类提供特征的val?
1 回答
我认为这是因为Scala为"public"变量生成了getter和setter - 变量本身总是私有的,但
scalac
使它们看起来好像是公共可访问的 .换句话说,我相信你的特质中的
val foo: String
声明实际上相当于:所以你需要提供一个实现
foo
方法的Java类,而不是公开一个公共变量 .