scala覆盖引用内部类的java类方法

时间:2013-10-29 17:25:47

标签: java scala

如果我在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方法(x $ 1:A#B):单位

我能使其发挥作用的唯一方法是执行以下操作:

class C extends A {

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

我发现这件事非常难看,并且想知道是否有更简洁的方法吗?

由于

1 个答案:

答案 0 :(得分:1)

明显的代码对我有用:

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测试) - 它可能是值得的提交有关此事的错误信息。