首页 > 解决方案 > Scala 伴侣与 Java 代码中的特征与抽象类

问题描述

我们可以为抽象类定义 Scala 伴生对象:

object CompanionAbstractClass {
  def newInstance():CompanionAbstractClass = CACChild("companion abstract class")
}
//sealed trait TestQ{
sealed abstract class CompanionAbstractClass{
  val name:String
}
case class CACChild(name:String) extends CompanionAbstractClass

从 Scala 代码中,我可以将其用作:

val q1 = CompanionAbstractClass.newInstance.name

从 Java 代码中,它可以用作:

CompanionAbstractClass.newInstance().name();

为了在 Scala 中更好地组合,我们更喜欢使用特征:

object CompanionTrait {
  def newInstance():CompanionTrait = CTChild("companion trait")
}
sealed trait CompanionTrait {
  val name:String
}
case class CTChild(name:String) extends CompanionTrait

在 Scala 中,它可以以与以前类似的方式使用:

CompanionTrait.newInstance().name

但是现在从 Java 中我不能以与以下相同的方式调用它:

CompanionTrait.newInstance().name();

我只能通过以下方式做到:

CompanionTrait$.MODULE$.newInstance().name();

为了改进以前的语法并摆脱这个“$”,我可以在 Scala 或 Java 中创建一个包装器(这不是我的选择):

object CompanionTraitFactory {
  def newInstance():CompanionTrait = CompanionTrait.newInstance()
}

现在从 Java 中我也可以将它用作:

CompanionTraitFactory.newInstance().name();

您能否解释一下,为什么如果为特征定义了伴随对象,我不能从 Java 中使用它,当它被定义为抽象类(CompanionAbstractClass案例)时,如何使用它,甚至作为通常的单例(CompanionTraitFactory案例)。伙计们,我或多或少地理解了 scala 特征和抽象类之间的区别。我想了解为什么以这种方式实现它,以及将来是否有可能在 Scala 中得到支持

标签: javascalatraitsscala-java-interopcompanion-object

解决方案


在工作案例中,您正在调用添加到抽象类的静态转发器。您以前没有在界面上获得静态转发,但您在 2.12 中这样做了。


推荐阅读