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

时间:2011-07-07 09:36:54

标签: java scala traits

我有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 个答案:

答案 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类,而不是公开变量