类java.lang.String类MyJavaClass中的值foo在Java类和Scala特性中具有不兼容的类型混合

Dun*_*gor 2 java scala traits

我有一个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?

And*_*yle 5

我认为这是因为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类,而不是公开一个公共变量.