8

次の Scala オブジェクトがあるとします。

object ScalaObject {
    val NAME = "Name"
}

Scala コンパイラは、NAMEフィールドにアクセスするためのパラメーターなしのメソッドを生成するようです。ただし、Java からこのフィールドにアクセスしようとすると、このフィールドにアクセスする唯一の方法は、次のようなパラメーターなしのメソッドを使用することです。

System.out.println(ScalaObject$.MODULE$.NAME());

valJavaが期待されるJavaイディオムごとに次のようにアクセスできるようにScalaコンパイラをだます方法はありますか?

System.out.println(ScalaObject$.MODULE$.NAME);
4

2 に答える 2

7

厳密には、答えはノーです。なぜなら、scala は単なるフィールドではなく、フィールドにアクセスするためのメソッドのペアを生成するからです。ただし、scala に で注釈を付けるval@scala.reflect.BeanProperty、Java スタイルの getter および setter メソッドが生成されます。

だからあなたが言うことはできませんが(あなたの場合)

ScalaObject$.MODULE$.NAME

あなたは言うことができるでしょう

ScalaObject$.MODULE$.getNAME()

これは、あなたが望んでいたものではなく、より Java に似たイディオムになります。

@BeanProperty注意: 私はそのようなすべて大文字の名前を試したことがないので、実際に何が生成されるかはわかりません。

于 2011-12-08T19:28:41.183 に答える
1

いいえ、バイトコードでは、フィールドにアクセスしてメソッドを呼び出す命令が異なるためです。次に、Javac (および IDE 構文ハイライター) にパッチを適用する必要があります。

于 2011-12-08T16:17:37.777 に答える