我有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?
答案 0 :(得分:5)
我认为这是因为Scala为“公共”变量生成了getter和setter - 变量本身始终是私有的,但是scalac
使它们看起来好像可以公开访问。
换句话说,我相信特征中的val foo: String
声明实际上等同于:
// def foo_=(s: String) // setter - would apply to var declarations
def foo: String // getter
因此您需要提供一个实现foo
方法的Java类,而不是公开变量。