2

クラスのコンストラクターで次の方法でプロパティを定義しました。

class Step(val message:String = "")

Java コードからメッセージ値にアクセスしようとすると、可視性エラーが発生します。なんで?

4

4 に答える 4

1

コードは正しいです。この場合、メッセージは公開されているはずですが、何らかの理由で公開されていません。したがって、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
>
于 2010-06-10T08:58:45.783 に答える
1

Javaコードでは、。を使用してフィールドにアクセスしようとしていると思いますstep.message。確かに、そのような分野があり、それは私的なものです。そのため、可視性エラーが発生します。Scalaで「val」フィールドを宣言すると、コンパイラーはフィールドとアクセサーメソッドを生成します。したがって、Javaでは使用する必要がありますstep.message()

于 2010-10-05T14:00:57.030 に答える
1

@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
于 2010-06-10T08:36:32.337 に答える
0

使ってみましたgetMessage()か?おそらくscalaがアクセサを生成しています。

于 2010-06-10T08:19:59.070 に答える