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?

我做错了什么?

编辑

我需要:公共类指纹

代替

class Fingerprint
4

4 回答 4

3

三件事:

  1. 正如您已经知道的那样,您的指纹类需要公开。
  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

从理论上讲,这应该可以正常工作。查看此博客 Re Java and Scala interop。 http://www.codecommit.com/blog/java/interop-between-java-and-scala

创建项目时,您是否指定了 Java、Scala 或 None(1,2 或 3)

于 2012-07-06T20:24:39.830 回答
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 回答