【发布时间】: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