5

如果我在java中定义了以下类

public class A
{
  protected class B
  {
  }

  protected void method(B b) {...}
}

我想在 scala 和 override 方法中继承它。我本来希望做以下事情:

class C extends A {

  override def method(b: B): Unit = {
    // ... do something
    super.method(b)
  }
}

但是,当我这样做时,scala 编译器不喜欢这样给出以下错误:

方法方法不会覆盖任何内容。注意:类 C 的超类包含以下非最终成员命名方法:protected[package ...] def method(x$1: A#B): Unit

我可以使它工作的唯一方法是执行以下操作:

class C extends A {

  override def method(b: A#B): Unit = {
    // ... do something
    super.method(b.asInstanceOf[this.B])
  }
}

我发现必须这样做非常难看,并且想知道是否有更简洁的方法?

谢谢

德斯

4

1 回答 1

2

显而易见的代码对我有用:

public class A {
  public class B {}
  protected void method(B b) {
    System.out.println("A#method");
  }
}

class C extends A {
  override def method(b: B): Unit = {
    println("C#method")
    super.method(b)
  }
}

然后在 sbt 控制台中:

scala> new C
res0: C = C@10ecc87a

scala> new res0.B
res1: res0.B = A$B@db9a93b

scala> res0.method(res1)
C#method A$B@db9a93b
A#method A$B@db9a93b

但是,如果我随后修改 C.scala 并让 sbt 进行增量重新编译,我会收到您看到的错误(使用 0.12.4 和 0.13.0 测试)——这可能值得提交一个 sbt 错误。

于 2013-10-30T00:11:34.383 回答