scala类中属性的可见性

我通过以下方式在我的类的构造函数中定义了一个属性:

class Step(val message:String = "") 

当我尝试从Java代码访问消息值时,会出现可见性错误。 为什么?

如果添加@scala.reflect.BeanProperty annontation,则会获得“自动” 获取设置方法

见http://www.scala-lang.org/docu/files/api/scala/reflect/BeanProperty.html

 scala> class Step(@scala.reflect.BeanProperty val message:String ) defined class Step scala> val s = new Step("asdf") s: Step = Step@71e13a2c scala> s.message res6: String = asdf scala> s.getMessage res10: String = asdf 

代码是正确的,在这种情况下消息应该是公开的,但由于某种原因,它不是。 所以,作为一个WO,你可以将它设为私有(只需删除“val”)并找到一种方法来为这个值生成一个getter:

 class Step(message: String = ""){ def getMessage() = message } 

要么:

 class Step(@scala.reflect.BeanProperty message: String = "") 

并编译:

 > scalac -cp . Step.scala 

然后创建调用Java类:

 public class SomeClass{ public static void main(String[] args) { Step step = new Step("hello"); System.out.println(" " + step.getMessage()); } } 

然后编译并运行:

 > javac -cp . SomeClass.java > java -cp "/home/olle/scala-2.8.0.Beta1-prerelease/lib/scala-library.jar:." SomeClass hello > 

我想在Java代码中你试图通过step.message访问该字段。 确实,有这样一个领域,它是私人的。 这就是您获得可见性错误的原因。 在Scala中声明“val”字段时,编译器会生成字段和访问器方法。 所以在java中你应该使用step.message()

你尝试过使用getMessage()吗? 也许scala正在生成访问者。