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