gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:58:03 31 4
gpt4 key购买 nike

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

但我的问题是我有嵌套的 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 中我需要创建一个 Action 列表。我试过这个...无济于事:

import Criteria.ActionCriteria.Action$

....

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

以及许多其他组合,例如为每个对象添加 $.MODULE$。现在我收到以下错误:

error: cannot find symbol Criteria.ActionCriteria

最佳答案

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] 中的类型,因此它返回与案例类对应的类型。当您在需要值的上下文中使用 Action 时,它会返回单例实例,因此您可以调用标准 Java 方法 getClass 来获取 的类型对象操作

如果您需要其他类型:

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 下的评论这是一个特例:

since objects are "the equivalent of static" in the Java world, we wanted to make it easier for Java code to use static inner classes. When there's only one level of nesting, there's a guaranteed companion: every top-level object gets a mirror class (if there isn't one) that creates static forwarders to module methods (that's how one can run a main method defined inside an object). Therefore, a special case for one-level nesting: those classes use the flattened name (without a $ suffix) as outer_name. So, Java code can say new Outer.Inner.


总结

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

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

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

关于java - 如何在 Java 中传递嵌套的 Scala 对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40776056/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com