Видимость свойств в классе 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 генерирует аксессор.

Другие вопросы по тегам