【问题标题】:Remove $init$ method from class with subclass从具有子类的类中删除 $init$ 方法
【发布时间】:2019-11-25 10:15:26
【问题描述】:

我在 Scala 中使用一个 Java 库,它从类定义中生成 D-Bus 接口。它适用于一个简单的 Scala 类:

@DBusInterfaceName("me.TestInterface")
trait TestInterface extends DBusInterface {
  def changeSomething(thing: String): Unit
}

我需要添加一个子类来实现 D-Bus 信号:

@DBusInterfaceName("me.TestInterface")
trait TestInterface extends DBusInterface {
  def changeSomething(thing: String): Unit

  final class SomethingChanged(thing: String) extends DBusSignal("SomethingChanged")
}

当我这样做时,我在我的 D-Bus 接口上获得了一个提取方法 $init$,大概是因为这是由 Scala 添加的。

是否可以在 Scala 中生成一个没有这个额外 $init$ 方法的子类?

我可以清楚地用 Java 编写并导入它,但我宁愿坚持纯 Scala。

【问题讨论】:

  • 为什么?有什么问题?
  • 让它成为一个类而不是一个特征?
  • @cchantep $init$ 方法成为已发布的 D-Bus 接口的一部分,即使它不是我的接口方法之一。

标签: java scala dbus


【解决方案1】:

我找到了解决方案。我意识到 Java 使用 static class 作为内部类。 Scala 中的等价物是将类放在伴生对象中:

@DBusInterfaceName("me.TestInterface")
trait TestInterface extends DBusInterface {
  def changeSomething(thing: String): Unit
}

object TestInterface {
  case class SomethingChanged(thing: String) extends DBusSignal("/me/Test")
}

这在 Scala 2.13 中确实有效,但我不确定这是我可以依赖的行为还是只是当前实现的一个特性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多