首页 文章

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

提问于
浏览
2

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

  • 5

    我认为这是因为Scala为"public"变量生成了getter和setter - 变量本身总是私有的,但 scalac 使它们看起来好像是公共可访问的 .

    换句话说,我相信你的特质中的 val foo: String 声明实际上相当于:

    // def foo_=(s: String)  // setter - would apply to var declarations
    def foo: String      // getter
    

    所以你需要提供一个实现 foo 方法的Java类,而不是公开一个公共变量 .

相关问题