【问题标题】:Accessing a Scala object from Java code从 Java 代码访问 Scala 对象
【发布时间】:2017-08-18 18:16:10
【问题描述】:

我正在尝试使用具有默认参数的 Scala 类:

object SimpleCredStashClient {

  def apply(kms: AWSKMSClient, dynamo: AmazonDynamoDBClient, aes: AESEncryption = DefaultAESEncryption) 
  ...
}

当我尝试从 Java 实例化此类的实例时,我收到错误:

错误:(489, 43) java: 找不到符号 符号:方法 SimpleCredStashClient(com.amazonaws.services.kms.AWSKMSClient,com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient) 位置:com.engineersgate.build.util.CredentialsUtil 类

DefaultAESEncryption 是一个 Scala 对象。如何在 Java 中访问 Scala 对象?

【问题讨论】:

标签: java scala


【解决方案1】:

默认参数成为<meth>$default$<idx>() 形式的合成方法。此外,对象A 的实例可以在A$.MODULE$(如果A 是顶级object)或outer.A()(如果A 定义为类似class O { object A })找到.因此,有两种方法可以做到这一点:

直接使用对象:

SimpleCredStashClient.apply(
    kms,
    dynamo,
    DefaultAESEncryption$.MODULE$
);

默认参数:

SimpleCredStashClient.apply(
    kms,
    dynamo,
    SimpleCredStashClient.apply$default$3()
);

第一个当然看起来更好,但如果默认参数发生变化,您也必须更新此代码。在第二个中,参数是任何默认参数,并且只有在参数停止具有默认值或更改其索引时才会中断。 Scala 在编译时使用第二种方法。

【讨论】:

  • 既然SimpleCredStashClient也是一个对象,我们应该使用SimpleCredStashClient.apply还是SimpleCredStashClient$.apply
  • SimpleCredStashClient.apply 是由scalac 生成的static 方法,仅用于Java 互操作,因此您应该使用它。它只是转发到SimpleCredStashClient$.MODULE$.apply,这是 Scala 代码最终使用的。
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
相关资源
最近更新 更多