我有一个看起来像这样的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
答案 0 :(得分:3)
三件事:
示例中的所有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
后)。