如何在Java中传递嵌套的Scala对象引用?

3
此前已经有一些类似的问题得到了解答。 但我的问题是我有嵌套的Scala对象,例如:
object Criteria {
    object ActionCriteria {
        case class Action (parameter: String) {
            def this(parameter: String) = { this(paramerter) }
        }

        object Action {
           def apply(parameter: String): Action = { apply(parameter) }
        } 
    }
}

在Java中,我需要创建一个动作列表。我已经尝试过这个方法...但是没有成功:
import Criteria.ActionCriteria.Action$

....

List<Criteria.ActionCriteria.Action$.MODULE$> actions = new ArrayList<>();

除了添加$.MODULE$与每个对象之外,还有许多其他组合。目前我遇到了以下错误:

error: cannot find symbol Criteria.ActionCriteria
1个回答

3
List<Criteria$ActionCriteria$Action> actions = new ArrayList<>();

似乎可以正常工作。在 Scala REPL 中找到了这个:

scala> classOf[Criteria.ActionCriteria.Action]
res1: Class[Criteria.ActionCriteria.Action] = class Criteria$ActionCriteria$Action

如果你需要 Action 对象的类型,而不是 case class (非常少见,但为了完整性):
scala> Criteria.ActionCriteria.Action.getClass
res2: Class[_ <: Criteria.ActionCriteria.Action.type] = class Criteria$ActionCriteria$Action$

差别是由于Scala期望ActionclassOf[Action]中作为类型,因此它返回与case类对应的类型。当你在需要值的上下文中使用Action时,它会返回单例实例,因此你可以调用标准的Java方法getClass来获取object Action的类型。如果你需要其他类型:
Criteria$                       cm    = Criteria$.MODULE$;
Criteria.ActionCriteria$        cacm  = Criteria.ActionCriteria$.MODULE$;
Criteria$ActionCriteria$Action$ cacam = Criteria$ActionCriteria$Action$.MODULE$;
Criteria$ActionCriteria$Action  caca  = new Criteria$ActionCriteria$Action("Foo");
Criteria.ActionCriteria$在这里打破了模式。为什么?根据Iulian Dragos在bug SI-2034下的评论,这是一个特殊情况:
由于对象在Java世界中等同于静态,我们希望让Java代码更容易使用静态内部类。当只有一层嵌套时,有一个保证的伴侣:每个顶级对象都会得到一个镜像类(如果没有),它创建静态转发器来模块方法(这就是如何运行对象内定义的main方法)。因此,一层嵌套有一种特殊情况:这些类使用扁平名称(不带$后缀)作为outer_name。因此, Java代码可以说 new Outer.Inner
总结:
  • 对于除第一层之外的每个嵌套级别,将.替换为$

  • 如果目标类型也是对象,则在末尾添加$

  • 如果您想要一个实例,请添加.MODULE$


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接