java - 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 中得到支持。
解决方案
在工作案例中,您正在调用添加到抽象类的静态转发器。您以前没有在界面上获得静态转发,但您在 2.12 中这样做了。
推荐阅读
- search - Windows 10 搜索中缺少子菜单
- internet-explorer - Microsoft Edge 和 Internet Explorer 显示不正确的网站图标
- reactjs - 如何在反应中删除购物车列表项目
- python - Django vs Flask - 考虑到我想设计一个端到端的物联网解决方案,哪个框架更强大
- c++ - Switch 语句和条件运算符 c++
- android - 当应用程序处于前台时,是否建议使用静默通知(FCM)将数据推送到移动应用程序中?
- tensorflow - tf.data 数据集中不同标签和输入数据形状的数量
- reactjs - React:如何在三元组中添加多个样式类?
- javascript - 将刺痛添加到 URL 的末尾?
- java - 读取任何 xls 文件时标头签名无效