从Java代码

时间:2017-08-18 18:16:11

标签: java scala

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

object SimpleCredStashClient {

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

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

Error:(489, 43) java: cannot find symbol
  symbol:   method SimpleCredStashClient(com.amazonaws.services.kms.AWSKMSClient,com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient)
  location: class com.engineersgate.build.util.CredentialsUtil

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

1 个答案:

答案 0 :(得分:1)

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

直接使用对象:

A

默认参数:

class O { object A }

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