Видимость свойств в классе Scala
Я определил свойство в конструкторе моего класса следующим образом:
class Step(val message:String = "")
Когда я пытаюсь получить доступ к значению сообщения из кода Java, у меня появляется ошибка видимости. Зачем?
4 ответа
Если вы добавите аннотацию @scala.reflect.BeanProperty, вы получите "автоматический" метод get и set
См. 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
Я думаю, что в коде Java вы пытаетесь получить доступ к полю с step.message
, Действительно, такое поле есть, и оно частное. Вот почему вы получаете ошибку видимости. Когда вы объявляете поля 'val' в Scala, компилятор генерирует метод поля и метода доступа. Так что в Java вы должны использовать step.message()
Код верный, в этом случае сообщение должно быть публичным, но по какой-то причине это не так. Так что, как WO, вы можете сделать его приватным (просто отбросить "val") и найти способ создать метод получения этого значения:
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
>
Вы пытались использовать getMessage()
? Может быть, Scala генерирует аксессор.