13

次のようなJavaクラスがあります。

public class Constants {
    public class Commands {
        public static final String CreateOrder = "CreateOrder";
    }
}

「CreateOrder」定数にアクセスしたいのですが、Java では次のように簡単にアクセスできます。

String co = Constants.Commands.CreateOrder

しかし、Scala ではこれが機能しないのはなぜですか??? Scala から "CreateOrder" にアクセスするにはどうすればよいですか。Java コードを変更することはできません。

ありがとう。

4

3 に答える 3

6

Java言語仕様から:

内部クラスは、定数変数 (§4.12.4) でない限り、またはコンパイル時エラーが発生しない限り、静的メンバーを宣言できません。

定数変数の場合、静的内部クラスではないためConstants.Commands.CreateOrder、通常は への参照をConstants.Commandsのインスタンスに関連付ける必要がありますが、構文を使用できます。Constants

これは、Java におけるクレイジーな 1 回限りの構文の特殊なケースと見なすことができ、Scala 言語の設計者が Scala の Java 相互運用性に組み込むことを気にかけなかった種類のものです。

あなたの最善の策 (実際の Java クラスがこのように見える場合) のインスタンスを作成するConstantsことです。この時点で、完全に自然な方法で内部クラスの static フィールドにアクセスできます。

scala> (new Constants).Commands.CreateOrder
res0: String = CreateOrder

何らかの理由でこれがオプションでない場合は、残念ながら、他の回答でリフレクションベースのアプローチを使用する必要があります。

于 2013-10-13T14:06:39.223 に答える
5

リフレクションとインスタンス化に代わる 3 つ目の方法は、小さな Java グルー コードを記述することだと思います。お気に入り

public class Glue {
    public static String createOrder() { return Constants.Commands.CreateOrder; }
}

次に、Scala から を書けるようになるはずですGlue.createOrder

于 2013-10-13T15:37:35.410 に答える