4

次のような Java ファイルがあります。

package AuthorizeNetFingerprint;


class Fingerprint {
    private static Log logger = LogFactory.getLog(Fingerprint.class);

    private long sequence;
    private long timeStamp;
    private String fingerprintHash;

    private Fingerprint() {
    }

    /**
     * Creates a fingerprint with raw data fields.
     * 
     * @param loginID
     * @param transactionKey
     * @param sequence : this number will be concatenated with a random value
     * @param amount
     * @return A Fingerprint object.
     */
    public static String createFingerprint(String loginID,
                    String transactionKey, long sequence, String amount) {
         return transactionKey;
    }
}

そして、私はこのscalaのようにアクセスしようとしています:

val fingerprint = new AuthorizeNetFingerprint.Fingerprint
val x_fp_hash = fingerprint.createFingerprint(x_api_login_id,
                  transaction_key, x_fp_sequence, x_amount)

そして、それは私にこのエラーを与えます:

パッケージ AuthorizeNetFingerprint 内のオブジェクト フィンガープリントにパッケージ AuthorizeNetFingerprint 内でアクセスできません

Play Framework で scala と Java を混在させることは可能ですか?

私が間違っていることは何ですか?

編集

私が必要としていたもの: public class Fingerprint

それ以外の

class Fingerprint
4

4 に答える 4

3

三つのこと:

  1. すでにわかっているように、Fingerprint クラスは公開する必要があります。
  2. Fingerprint のコンストラクターを非公開にしました。インスタンス化することはできません。
  3. Java クラスの静的メソッドは、Scala のクラスのコンパニオン オブジェクトを介してアクセスする必要があります。

例のすべての Scala コードを次のように置き換える必要があります。

val x_fp_hash = AuthorizeNetFingerprint.Fingerprint.createFingerprint(…)

これは、sbt (0.11.3) でコンパイルされた Scala (2.9.1) コンソールで動作します。

はい、Play2 アプリケーションに Java と Scala を混在させることができます。Java コードを app ディレクトリに入れるだけです。Java クラスは、対応するパッケージ ディレクトリにある必要があることに注意してください。これは、Scala クラスには当てはまりません。

于 2012-07-08T07:57:23.117 に答える
2

私は Play フレームワークに詳しくありませんが、Scala サンプル コードの最初の行で class をインスタンス化する必要があります。これはプライベート コンストラクターAuthorizeNetFingerprint.Fingerprintのみを持ち、パブリック クラスではありません(つまり、同じパッケージからしかアクセスできません)。

AuthorizeNetFingerprint.Fingerprint.createFingerprint(...)クラスを作成した後、おそらく呼び出しが機能しpublicますか?

于 2012-07-06T20:48:27.980 に答える
0

Java パッケージの名前はすべて小文字にするのが一般的です。

また、大文字で始まる Java パッケージを使用しようとすると、Scala が混乱するようです。authorizeの代わりにパッケージ名として使用すると、AuthorizeNetFingerprintコンパイルされます。

また、これは必要ありません:

val fingerprint = new AuthorizeNetFingerprint.Fingerprint 

createFingerprintは静的メソッドなので、呼び出すだけです

val x_fp_hash = Fingerprint.createFingerprint

(インポート後authorize.Fingerprint)。

于 2012-07-07T00:20:25.833 に答える
0

理論的には、これで問題なく動作するはずです。Java と Scala の相互運用に関するこのブログを参照してください。 http://www.codecommit.com/blog/java/interop-between-Java-and-scala

プロジェクトの作成時に、Java、Scala、または None を指定しましたか (1、2、または 3)

于 2012-07-06T20:24:39.830 に答える