5

Javaで次のクラスが定義されている場合

public class A
{
  protected class B
  {
  }

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

そして、それをscalaで継承し、メソッドをオーバーライドしたいと考えています。私は次のことを望んでいたでしょう:

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 に答える