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正在生成访问者。