【问题标题】:How to pass nested scala object reference in Java?如何在 Java 中传递嵌套的 scala 对象引用?
【发布时间】:2016-11-23 23:52:57
【问题描述】:

之前已经回答了一些问题。

但我的问题是我嵌套了 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

【问题讨论】:

    标签: java scala interop


    【解决方案1】:
    List<Criteria$ActionCriteria$Action> actions = new ArrayList<>();
    

    似乎工作正常。用 Scala REPL 找到了这个:

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

    如果您想要Action 对象的类型,而不是案例类(极不可能,但为了完整起见):

    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 方法)。因此,一个 一级嵌套的特殊情况:这些类使用扁平化的 名称(没有$ 后缀)作为外部名称。所以,Java 代码可以说new Outer.Inner


    总结

    • 对于除第一层之外的每一层嵌套,您将类名中的 . 替换为 $

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 2018-10-28
      相关资源
      最近更新 更多