クラスのコンストラクターで次の方法でプロパティを定義しました。
class Step(val message:String = "")
Java コードからメッセージ値にアクセスしようとすると、可視性エラーが発生します。なんで?
クラスのコンストラクターで次の方法でプロパティを定義しました。
class Step(val message:String = "")
Java コードからメッセージ値にアクセスしようとすると、可視性エラーが発生します。なんで?
コードは正しいです。この場合、メッセージは公開されているはずですが、何らかの理由で公開されていません。したがって、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
>
Javaコードでは、。を使用してフィールドにアクセスしようとしていると思いますstep.message
。確かに、そのような分野があり、それは私的なものです。そのため、可視性エラーが発生します。Scalaで「val」フィールドを宣言すると、コンパイラーはフィールドとアクセサーメソッドを生成します。したがって、Javaでは使用する必要がありますstep.message()
@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
使ってみましたgetMessage()
か?おそらくscalaがアクセサを生成しています。