【问题标题】:Scala companion with trait vs abstract class from Java codeScala 伴侣与 Java 代码中的特征与抽象类
【发布时间】:2018-07-02 16:03:51
【问题描述】:

我们可以为抽象类定义 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 中得到支持

【问题讨论】:

    标签: java scala traits scala-java-interop companion-object


    【解决方案1】:

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

    【讨论】:

    • 我忘了说,你的未来是 2.12 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2011-03-03
    • 2011-05-14
    相关资源
    最近更新 更多