在Play Framework中混合使用scala和java

时间:2012-07-06 20:08:01

标签: java scala playframework

我有一个看起来像这样的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 个答案:

答案 0 :(得分:3)

三件事:

  1. 正如您已经想到的那样,您的指纹课程需要公开。
  2. 您已将Fingerprint的构造函数设为私有;你无法实例化它。
  3. Java类中的任何静态方法都应该通过Scala中的类“伴随对象”来访问。
  4. 示例中的所有Scala代码都应替换为:

    val x_fp_hash = AuthorizeNetFingerprint.Fingerprint.createFingerprint(…)
    

    这适用于Scala(2.9.1)控制台,使用sbt(0.11.3)编译。

    是的,您可以在Play2应用程序中混合Java和Scala,只需将Java代码放在app目录中即可。请注意,Java类需要位于其对应的包目录中,而Scala类则不是这样。

答案 1 :(得分:2)

我不熟悉Play框架,但是Scala示例代码中的第一行应该实例化类AuthorizeNetFingerprint.Fingerprint,它只有私有构造函数并且不是公共类(即,只能从同一个包中访问)。

在制作课程AuthorizeNetFingerprint.Fingerprint.createFingerprint(...)之后,或许拨打public可能有效吗?

答案 2 :(得分:0)

从理论上讲,这应该可行。看看这篇博客Re Java和Scala interop。 http://www.codecommit.com/blog/java/interop-between-java-and-scala

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

答案 3 :(得分:0)

以小写命名Java包是常规的。

如果您尝试使用以大写字母开头的Java包,Scala似乎也会感到困惑。如果您使用authorize作为包名而不是AuthorizeNetFingerprint,则会进行编译。

此外,没有必要这样做:

val fingerprint = new AuthorizeNetFingerprint.Fingerprint 

createFingerprint是一种静态方法,所以只需调用

即可
val x_fp_hash = Fingerprint.createFingerprint

(导入authorize.Fingerprint后)。