- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
之前已经回答了一些问题。
但我的问题是我有嵌套的 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 期望 Action
是 classOf[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 saynew Outer.Inner
.
对于除第一层之外的每一层嵌套,您都将 .
替换为类名中的 $
如果目标类型也是对象,则在末尾添加$
如果您想要一个实例,请添加 .MODULE$
关于java - 如何在 Java 中传递嵌套的 Scala 对象引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40776056/
我是一名优秀的程序员,十分优秀!